闭包函数
-
互相嵌套的两个函数叫做闭包,内函数就是闭包函数
-
基本语法
def zhangyutai_family(): father = "马云" def say(): print("以后,不准叫我首富,我是韭菜,我已躺平,这是我的爸爸{}说的".format(father)) return say func1 = zhangyutai_family() print(func1 , type(func1)) # 调用函数 func1()
-
闭包的特点
延长局部变量的生命周期,生命周期和全局变量一样长,直到代码全部执行结束之后,在释放变量
-
原因:
正常来说,局部变量调用时开辟空间,调用结束后,释放空间,所以显得局部变量生命周期较短,但是闭包函数会刻意延长局部变量的生命周期
def outer(num): def inner(val): return num + val return inne num 是局部变量 ,作用范围在outer的内部 val 是局部变量 ,作用范围在inner的内部 正常来说,在调用函数时,创建这些局部变量 在调用结束后,释放这些局部变量 但是由于所写的是闭包函数,会延长局部变量的生命周期 func = outer(5) res = func(4) print(res)
-
解析过程:
func = outer(5) num 接受参数 5 由于内函数使用了外函数的局部变量num ,自己又是闭包,所以刻意延长num这个局部变量的生命周期,不被内存释放.该变量和内函数绑定在一起了. res = func(4) val 接受参数 4 return num + val => return 5 + 4 => 9 res = 9
-
判定是否是闭包的方法(了解)
-
获取闭包函数使用的变量 closure , cell_contents (了解)
-
能够获取到单元格对象就是闭包函数,反之得到None就不是闭包函数
-
获取单元格对象,封装在元组中 res = func1.closure
-
如果获取的闭包函数中有延长的局部变量,就是闭包函数,如果返回None,就不是闭包函数
print(res) # ( <cell at 0x000000000223A558: int object at 0x000000005B7280F0> 对象 , ) 元组
-
获取元组当中的,cell对象 cell = res[0] print(cell)
-
获取对象中的被延长的局部变量 print(cell.cell_contents) # 马云
def foo(z): x = 100 y = 200 def inner(): print(z) print("inner") return inner func = foo(300) func()
-