python闭包

闭包——装饰器的本质也是闭包

“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。

“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。

(1)第一种形式——直接调用

def Maker(name):
    num=100
    def func1(weight,height,age):
        weight+=1
        height+=1
        age+=1
        print(name,weight,height,age)
    func1(100,200,300) #在内部就直接调用“内部函数”
Maker('feifei') #调用外部函数,输出 feifei 101 201 301

 (2)第二种形式——返回函数名称

 

def Maker(name):
    num=100
    def func1(weight,height,age):
        weight+=1
        height+=1
        age+=1
        print(name,weight,height,age)
    return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象)
maker=Maker('feifei') #调用包装器
maker(100,200,300) #调用内部函数

 (3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。

def Maker(step): #包装器
    num=1
    def fun1(): #内部函数
        nonlocal num #nonlocal关键字的作用和前面的local是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值
        num=num+step #改变外部变量的值(如果只是访问外部变量,则不需要适用nonlocal)
        print(num)
    return fun1
#=====================================#
j=1
func2=Maker(3) #调用外部包装器
while(j<5):
    func2() #调用内部函数4次 输出的结果是 4、7、10、13
    j+=1

从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.

从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。

nonlocal关键字的作用

该关键字的作用和local的作用类似,就是让“内部函数”可以修改“外部函数(装饰器)”的局部变量值。详细信息这里不做讨论。

posted @ 2022-03-04 14:17  lagjaflgjfl  阅读(27)  评论(0编辑  收藏  举报