闭包

闭包的特性:不同版本代码的比较

第一版: 没有保证数据的安全

 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)

print(avg(100000))
print(avg(110000))
print(avg(120000))

print(globals())

修改自由变量:

def make_average():

 count = 1
 def average():
     nonlocal count
     count += 1
     return count
 return average
 avg = make_average()

 print(avg)
 print(avg())
 print(avg())
 print(avg())
 print(avg())

举例判断是否是闭包:

例一:
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)
    name = 'alex'

return inner

a = 2
b = 3
ret = wrapper(a, b)
业哥 不是
其他人 都说是

判断一个函数是不是闭包 == 闭包函数有没有自由变量
print(ret.code.co_freevars) #判断方法

了解
print(ret.code.co_varnames) # 函数中的局部变量
闭包的应用:
1,保证数据的安全。
2,装饰器的本质。

原文地址:https://www.cnblogs.com/ayongxin93/p/11064918.html