第一版: 没有保证数据的安全
l1 = [] #全局变量
def make_average(price):
l1.append(price)
total = sum(l1)
return total/len(l1)
print(make_average(100000))
print(make_average(110000))
print(make_average(120000))
'''
有很多代码....
'''
l1.append(666)
print(make_average(90000))
第二版:
每次执行l1是空的。
def make_average(price):
l1 = []
l1.append(price)
total = sum(l1)
return total/len(l1)
print(make_average(100000))
print(make_average(110000))
print(make_average(120000))
为了保证数据的安全,闭包
def make_average():
l1 = []
def average(price):
l1.append(price)
total = sum(l1)
return total/len(l1)
return average
avg = make_average()
print(avg)>>>
<function make_average.
print(avg(100000))
print(avg(110000))
print(avg(120000))
-
def make_average():
count = 1
def average():
nonlocal count
count += 1
return countreturn average
avg = make_average()print(avg)
print(avg())
print(avg())
print(avg())
print(avg())
'''
2
3
4
5
'''
```
判断是否是闭包:
例一:
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper()
是
例二:
a = 2
def wrapper():
def inner():
print(a)
return inner
ret = wrapper()
不是
例三:
def wrapper(a,b):
'''
:param a: 2
:param b: 3
:return:
'''
name = 'alex'
def inner():
print(a)
print(b)
age = 'alex'
return inner
a = 2
b = 3
ret = wrapper(a, b)
也是闭包
判断一个函数是不是闭包 == 闭包函数有没有*变量
print(ret.__code__.co_freevars)# ('a', 'b')
了解
print(ret.__code__.co_varnames) # 函数中的局部变量
('age',)
- 闭包: 多用于面试题: 什么是闭包? 闭包有什么作用。
1,闭包只能存在嵌套函数中。
2, 内层函数对外层函数非全局变量的引用(使用),就会形成闭包。被引用的非全局变量也称作*变量,这个*变量会与内层函数产生一个绑定关系,*变量不会再内存中消失。闭包的作用:保证数据的安全。
-
如何判断一个嵌套函数是不是闭包
1,闭包只能存在嵌套函数中。
2, 内层函数对外层函数非全局变量的引用(使用),就会形成闭包
-
闭包的应用:
- 保证数据的安全。
- 装饰器的本质