1、闭包: 保护数据安全、保护数据干净性。
2、闭包的定义:在嵌套函数内、使用非全局变量(且不使用本层变量)
将嵌套函数返回
3、闭包举例子:
def func():
a = 10
def foo():
print(a)
return foo
f = func()
f()
结果:10
4、验证闭包函数:__closure__
def func():
a = 10 #自由变量
def foo():
print(a) #打印a有一个绑定关系
return foo
f = func()
print(f.__closure__)
结果:(<cell at 0x0000000001E285E8: int object at 0x00000000525A8190>,)
5、函数体执行完以后将函数体开辟的空间都释放掉了
6、模拟买车求平均价版一:
lst = []
def buy_car(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
buy_car(120000) #周一
buy_car(240000) #周二
buy_car(10000000) #周三
buy_car(5500000) #周四
buy_car(120000) #周五
buy_car(50000000) #周六
buy_car(5000000) #周日
结果: 120000.0
180000.0
3453333.3333333335
3965000.0
3196000.0
10996666.666666666
10140000.0
7、版二:查看闭包函数里面的自由变量__code__.co_freevars:
def buy_car():
lst = []
def func(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
return func
f = buy_car()
print(f.__code__.co_freevars)
f(1)
f(2)
f(3)
f(4)
f(5)
结果:('lst',)
1.0
1.5
2.0
2.5
3.0
8、查看闭包函数里面的局部变量__code__.co_varnames:
def buy_car():
lst = []
def func(price):
lst.append(price)
arg = sum(lst) / len(lst)
print(arg)
return func
f = buy_car()
print(f.__code__.co_freevars)
print(f.__code__.co_varnames)
f(1)
f(2)
f(3)
f(4)
f(5)
结果:('lst',)
('price', 'arg')
1.0
1.5
2.0
2.5
3.0
9、没有将嵌套的函数返回也是一个闭包、但是这个闭包不是一个可使用的闭包:
def func():
a = 10
def foo():
print(a)
print(foo.__closure__)
func()
# 结果:(<cell at 0x00000000021785E8: int object at 0x00000000592F8190>,)
10、