目录
闭包的定义:
一个函数定义中引用了函数定义以外的函数变量,并且该函数可以在函数定义外执行
闭包的条件
1.必须是一个内嵌函数(函数里定义的函数)---这对应函数之间的嵌套
2.内嵌函数必须引用一个定义在闭包范围内(外部函数里)的变量 --- 内部函数引用外部变量
3.外部函数必须返回内嵌函数---必须返回那个内嵌函数
创建一个闭包函数:
def fun_a(num_a): #创建一个内嵌函数fun_a()
def fun_b(num_b): #内嵌函数引用外部变量
print("内嵌函数fun_b的参数是:%s,外部函数fun_a的参数是:%s"%(num_b,num_a))
return num_a+num_b
return fun_b #返回内嵌函数fun_b
result = fun_a(10) #给fun_a传参10
print(result(100)) #给函数fun_a的内嵌函数传参100
# print(result(200))
闭包的应用(使用闭包来创建一个一元线性函数)
def create_line(a,b):
def line1(x):
return a*x+b
return line1
l1 = create_line(3,5)
l2 = create_line(6,7.2)
print(l1(2))
print(l2(5))
测试是否可以对外部函数进行修改
def test1():
count = 1
def add():
print(count)
count+=1
return add
print(test1()())
说明:这里的报错说明这个本地count变量,不能在引用之前被修改
要想解决上面的问题可以使用下面的办法:
因为这里的count变量被当作了本地变量,而实际上该变量是介于本地变量和全局变量之间的变量,要想修改外部变量可以将该变量使用nonlocal标识(谁使用谁标识,这里在add中使用,所以在add函数里标识),就可以进行修改了修改如下:
闭包的陷阱:
def hs():
fun_list = []
for i in range(1,3):
def pf():
return i**2
fun_list.append(pf)
return fun_list
fun1,fun2 = hs()
print(fun1(),fun2())
运行结果如下:
说明:如果运行正确的话,运行结果应该是1和4,因为分别是1的平方和2的平方,但是这里出现的结果是两个4,出现这种情况的原因是因为在创建函数fun1和fun2的时候,这里的pf函没有调用继续调用,一直到i=2的时候才开始调用,所以导致fun1和fun2所使用的参数i都等于2,也就导致最后输出的结果是两个4,要想解决这个问题,就要在返回pf的时候对i进行调用,就可以解决这个问题,代码如下:
说明:这里的p1就是对i的调用,这样就会防止上一步的等到最后一个函数返回的时候才进行调用
关于闭包的总结:
闭包其实就是一个函数内嵌在另一个函数内,并且这个内嵌函数可以在函数外被调用,而且该内嵌函数必须被返回。
以上的观点仅是个人观点,如有不足,请各位大佬在评论区里指出,如果对你有帮助,请记得收藏