内层函数引用外层函数的变量,返回内层函数成为闭包。
如:
def calc_sum(lst):
def lazy_sum():
return sum(lst) #内层函数引用外层函数的变量
return lazy_sum #返回内层函数
例子1:
def count():
fs = [] #初始化fs
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs #返回的是函数f
f1,f2,f3 = count() #调用count()函数:经过for循环,i=1:fs=[f], i=2:fs=[f f] ,i=3:fs=[f f f]
print(f1(),f2(),f3()) #当调用f()函数时,此时i的值为3,输出 9 9 9
开始 我以为 for循环随着i的值的改变,会执行3次f(),这个想法是错的,并不是顺序执行,而是调用到函数f(),才会执行到f(),也就是Print f1(),f2(),f3()的时候才会执行def f(): return i*i
例子2
def count():
fs = []
for i in range(1,4):
def f(m = i):
return m ** 2
fs.append(f)
return fs
f1,f2,f3 = count()
print(f1(),f2(),f3()) #输出1 4 9
例子3
def count():
fs = []
for i in range(1,4):
def f(j):
def g():
return j*j
return g
r = f(i) #r是g()的闭包
fs.append(r) #fs存的是g()闭包的三个实现,分别在输入1,2,3的时候
return fs
f1,f2,f3 = count() #f1,f2,f3是三个闭包
print(f1(),f2(),f3()) #输出1 4 9 加()后就是函数的求值,所以f1()就相当于call g(1),返回值就是1,f2()就相当于call g(2),返回值就是4等
例子4
def count():
fs = []
for i in range(1,4):
def f(j):
return j*j
r = f(i)
fs.append(r) #r是函数f()计算后的返回值,是Int型对象,fs是一个3个整数的list
return fs
print count() #输出[1, 4 , 9]
关于输出 1 4 9 的另一个方法,但没有用到闭包
def count():
fs = []
for i in range(1,4):
fs.append(i*i)
return fs
f1,f2,f3 = count()
print(f1,f2,f3) #输出1 4 9