基于这个链接,结合自己的经验来理解闭包。
https://blog.csdn.net/u013380694/article/details/90019571
A. 都是对象,函数里面产生一个内部函数的对象,把内部函数当做结果返回.
def Outer():
def Inner():
pass
return Inner
f1 = Outer()
f2 = Outer()
f1和f2是两个不同的函数对象
B. 内部函数可以一直使用外部函数的变量。
一个函数结束的时候,会把自己的临时变量都释放给内存,之后变量都不存在了。但是闭包是一个特别的情况。外部函数发现,自己的临时变量会在将来的内部函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量和内函数绑定在一起。所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。
def Outer():
a = 5
def Inner():
print(a) #这里使用了外部变量
return Inner
C. 外函数变量的修改
外函数变量可以直接引用,但是不能修改,比如
def Outer():
a = 5
def Inner():
a -= 1 #这里会报错
print(a) #这里使用了外部变量
return Inner
所有,需要用nonlocal关键字来修饰
def Outer():
a = 5
def Inner():
nonlocal a
a -= 1
print(a) #这里使用了外部变量
return Inner
D. 闭包函数被多次调用的情况
同一个闭包函数被多次调用时,其外部变量的变化会被保存下来。
def Outer(par):
a = par
def Inner():
nonlocal a
a -= 1
print(a) #这里使用了外部变量
return Inner
fun = Outer(5)
fun() #这里输出4
fun() #这里输出3,因为a已经在前一次调用时候从5变成了4
E. 比用的个人应用
给出一系列系数,产生一个多项式函数
比如给出c4,c3,c2,c1,c0,得到
f(x) = c4 * x^4 + c3 * x^3 + c2 * x^2 + c1*x+c0
def get_poly_fun(c_list):
#外函数,c_list为系数list
#内函数,参数为x
def poly_func(x):
ret = 0 #待返回的结果
degree = len(c_list) - 1 #确定最高次的次数
for c in c_list: #确定函数的算法
ret += c*x**degree
degree -= 1
return ret #返回结果
return poly_func #返回内函数
#测试
c_list = [1,2,1]
poly_func = get_poly_fun(c_list) #poly_func应该是X^2 + 2 *X + 1
print(poly_func(1)) #这里输出4
print(poly_func(-1)) #这里输出0