python闭包(笔记)

一、闭包必须具备的条件

1、必须存在函数嵌套。
2、内部函数必须引用外部函数的变量。
3、内部函数必须不能引用全局变量。
4、外部函数的返回值必须是内部函数的函数名。

二、闭包的伪代码格式

def 外层函数(参数):
    def 内层函数():
        print("内层函数执行", 参数)

    return 内层函数


内层函数的引用 = 外层函数("传入参数")
内层函数的引用()

三、闭包的简单案例

def func1(a, b):
    c=100
    def inner_func():
        s=a+b+c
        print(s)
    return inner_func

f=func1(1,2)
f()

#输出结果:126

四、变量内存的释放

通常情况下,当一个函数运行结束,函数内部的所有东西都会释放掉,还给内存,函数的局部变量也会因此消失。然而,闭包是一种特殊情况,如果外部函数在结束时发现其变量会在内部函数中被使用,就会把这个变量绑定给内部函数,然后再结束自己的运行。

五、内部函数中修改外函数的值

上面讲到,一般在函数结束时,会释放临时变量,但在闭包中,由于外函数的临时变量在内函数中用到,此时外函数会把临时变量与内函数绑定到一起,这样虽然外函数结束了,但调用内函数时依旧能够使用临时变量,即闭包外层的参数可以在内存中进行保留
如果想要在内函数中修改外函数的值,需要使用 nonlocal 关键字声明变量

def func1(a, b):
    c=100
    def inner_func():
        nonlocal c
        c+=23
        s=a+b+c
        print(s)
    return inner_func

f=func1(1,2)
f()

#输出结果:126

六、在内部函数中修改全局变量的值

则需要将全局变量声明global在内部函数中

global_num=99
def func1(a, b):
    c=100
    def inner_func():
        nonlocal c
        global global_num
        global_num+=33
        c+=23
        s=a+b+c+global_num
        print(s)
    return inner_func

f=func1(1,2)
f()

#输出结果:258

七、闭包的作用

1、可以使用同级的作用域
2、读取其他元素的内部变量
3、延长作用域

def func1(a, b):
    c=10

    def inn_fun():
        s=a+b+c
        print(s)
    return inn_fun
ser=func1(6,9)
ser2=func1(2,8)
ser()
ser2()

#输出结果:
#25
#20

八、闭包总结

1、闭包似乎优化了变量,原来需要类对象完成的工作,闭包也可以完成。
2、由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
3、闭包的好处,使代码变得简洁,便于阅读代码。
4、闭包是理解装饰器的基础。

猜你喜欢

转载自blog.csdn.net/yjh_SE007/article/details/105693702