python之闭包函数及相关内容

一、函数对象

 精髓:可以把函数当成变量去用

 1、可以赋值

def func():
    print('from func')

f=func
print(f,func)
f()

 2、可以当做函数当做参数传给另外一个函数

def func():
    print('from func')

def foo(x): # x = func的内存地址

    # print(x)

    x()

foo(func) # foo(func的内存地址)

 3、可以当做函数当做另外一个函数的返回值

def foo(x):  # x=func的内存地址
    return x  # return func的内存地址

res=foo(func)  # foo(func的内存地址)
print(res)  # res=func的内存地址

res()

 4、可以当做容器类型的一个元素

l=[func,]

# print(l)

l[0]()

dic={'k1':func}
print(dic)
dic['k1']()

 函数对象应用示范:

def login():
    print('登录功能')

def transfer():
    print('转账功能')

def check_banlance():
    print('查询余额')

def withdraw():
    print('提现')

def register():
    print('注册')

func_dic={
    '1':login,
    '2':transfer,
    '3':check_banlance,
    '4':withdraw,
    '5':register
}

# func_dic['1']()

while True:
    print("""
    0 退出
    1 登录
    2 转账
    3 查询余额
    4 提现
    5 注册
    """)
    choice = input('请输入命令编号:').strip()
    if not choice.isdigit():
        print('必须输入编号,傻叉')
        continue

    if choice == '0':
        break

    if choice in func_dic:
        func_dic[choice]()
    else:
        print('输入的指令不存在')

    # if choice == '1':
    #     login()
    # elif choice == '2':
    #     transfer()
    # elif choice == '3':
    #     check_banlance()
    # elif choice == '4':
    #     withdraw()
    # else:
    #     print('输入的指令不存在')

二、函数嵌套

1、函数的嵌套调用:在调用一个函数的过程中又调用其他函数

def max2(x,y):
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):
    res1=max2(a,b)   # 第一步:比较a,b得到res1
    res2=max2(res1,c)  # 第二步:比较res1,c得到res2
    res3=max2(res2,d)  # 第三步:比较res2,d得到res3
    return res3

res=max4(1,2,3,4)
print(res)

2、函数的嵌套定义:在函数内定义其他函数

def f1():
    def f2():
        pass

# 圆形
def circle(radius,action=0):
    from math import pi

    def perimiter(radius):  # 求圆形的求周长:2*pi*radius
        return 2*pi*radius

    def area(radius):  # 求圆形的求面积:pi*(radius**2)
        return pi*(radius**2)

    if action == 0:
        return 2*pi*radius

    elif action == 1:
        return area(radius)

circle(33,action=0)

三、闭包函数

1、大前提:
  闭包函数=名称空间与作用域+函数嵌套+函数对象
  核心点:名字的查找关系是以函数定义阶段为准

2、什么是闭包函数
  "闭"函数指的该函数是内嵌函数
  "包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)

闭包函数:名称空间与作用域的应用+函数嵌套

def f1():
    x = 33333333333333333333
    def f2():
        print(x)
    f2()

x=11111
def bar():
    x=444444
    f1()

def foo():
    x=2222
    bar()

foo()

闭包函数:函数对象

def f1():
    x = 33333333333333333333
    def f2():
        print('函数f2:',x)
    return f2

f=f1()

# print(f)

# x=4444

# f()

def foo():
    x=5555
    f()

foo()

三:为何要有闭包函数--------->闭包函数的应用
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参

def f2(x):
    print(x)

f2(1)
f2(2)
f2(3)

方式二:

def f1(x): # x=3
    x=3
    def f2():
        print(x)
    return f2

x=f1(3)
print(x)

x()

案例:已简单的爬虫,爬网页数据为例

import requests

# 传参的方案一:
 def get(url):
     response=requests.get(url)
     print(len(response.text))

 get('https://www.baidu.com')
 get('https://www.cnblogs.com/linhaifeng')
 get('https://zhuanlan.zhihu.com/p/109056932')

# 传参的方案二:
def outter(url):
    # url='https://www.baidu.com'
    def get():
        response=requests.get(url)
        print(len(response.text))
    return get

baidu=outter('https://www.baidu.com')
baidu()

cnblogs=outter('https://www.cnblogs.com/linhaifeng')
cnblogs()

zhihu=outter('https://zhuanlan.zhihu.com/p/109056932')
zhihu()

原文地址:https://www.cnblogs.com/Lance-WJ/p/12534196.html

时间: 2024-08-30 00:39:12

python之闭包函数及相关内容的相关文章

Python作用域-->闭包函数-->装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外

python的闭包函数

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包. #闭包函数的实例# outer是外部函数 a和b都是外函数的临时变量def outer( a ): b = 10 # inner是内函数 def inner(): #在内函数中 用到了外函数的临时变量 print(a+b) # 外函数的返回值是内函数的引用 return inner if __name__ == '__main__': # 在这里我们调用外函数传入参数5 #此

python 15 闭包函数

目录 1.函数对象 2.函数嵌套 3.闭包函数 4.闭包的用途 1.函数对象 精髓:把函数当成变量去用,具体可以分为四个方面的使用 1.可以赋值,函数名A赋值给B,直接B()就可以引用该函数了 f=func print(f,func) f() 2.函数可以作为参数传入另外一个函数 def foo(x): # x = func的内存地址 # print(x) x() foo(func) # foo(func的内存地址) 3.函数的返回值可以是一个函数 def foo(x): # x=func的内存

Swift的函数与函数指针、闭包Closure等相关内容介绍

<span style="font-size:24px;">//函数 //demo1 无參数类型 func testConcat(){ println("測试函数"); } testConcat()//调用demo1 //demo2 多參数,一个返回值 /* 函数以func开头,表示一个函数 v1表示參数.String參数类型 ->返回值类型String */ func testConcats(v1:String,v2:String) ->S

python之闭包函数 装饰器 作业

一:编写函数,(函数执行的时间是随机的) import randomdef t(): time.sleep(random.randrange(1,3)) print('hello')二:编写装饰器,为函数加上统计时间的功能 import timeimport randomdef timebe(func): def wrapper(*args,**kwargs): start_time=time.time() res = func(*args, **kwargs) end_time=time.ti

python高级之函数

python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多重复的代码,这样代码重用率就比较低...并且这样的代码维护起来也是很有难度的,为了解决这些问题,就出现了函数,用来将一些经常出现的代码进行封装,这样就可以在任何需要调用这段代码的地方调用这个函数就行了. 函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其

Python高阶函数-闭包

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的. 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来. 但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心. 等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.