闭包函数
0.什么叫做闭包
闭包:内部函数调用外部函数的变量(非全局变量),python把这个情况成为闭包.
# def func1(): # a = 'Sath' # def func2(): # print(a) # return func2
1. 闭包的优点
1.常驻内存
一个函数运行完之后,python解释器会回收内存,但是当一个函数的内部还有函数,并且这个内部函数引用了外函数
的变量,那么python会认为这是一个闭包,就会将外函数的变量绑定给内函数,供内函数使用,不会随着外函数的结束
而销毁这个变量,会留在内存中,也就是常驻内存.
2.防止其他程序改变这个函数内的变量
当你的函数调用一个全局变量时,这个全局变量是所有人都可以用的
不能保证这个变量的唯一性和可信赖性,容易因为变量的问题程序出现bug
际上就是在全局变量中,留出一块地方供你的程序使用,别人的非法手段进不到你的程序中,也就是开发封闭性
2.如何判断函数是否为闭包
# 可以使用"__closure__"来检测函数是否为闭包,返回"cell"就是闭包,返回"None"就不是闭包 # def func1(): # a = 'Sath' # def func2(): # print(a) # print(func2.__closure__) # return func2 # func1() # 返回值如下 # (<cell at 0x0000000002177588: str object at 0x0000000002807260>,)
3.当内部函数没有调用外部函数的变量时就不是闭包
# def func1(): # a = 'Sath' # def func2(): # print(123) # print(func2.__closure__) # return func2 # func1() # 当返回None时证明这不是一个闭包 # None
4.如何在函数外部调用内部函数
def func1(): name = 'sath' def inner(): print(name) return inner # 内部函数最为外部函数的返回值 ret = func1() # 就相当于"ret = inner" ret() # 想平常调用函数一样就可以 # 结果:sath