学习python的闭包之前需要先知道python的返回函数。
python的返回函数
python中不仅可以返回int、str、list等数据,还可以返回函数。返回函数和返回函数值不同。
返回函数有延迟执行的效果。返回值是立即被执行给出结果。返回函数可以在需要执行的时候再调用函数执行。
例:编写函数calc_prod,它接收一个list,返回一个函数。返回函数可以计算参数的累积。
def calc_prod(lst):
def lazy_prod():
def f(x,y):
return x*y
return reduce(f,lst)
return lazy_prod
f = calc_prod([1,2,3,4])
print f # 返回一个函数
print f() # 返回函数值
python中的闭包
内层函数引用了外层函数的变量,然后返回内层函数的情况,称之为闭包。
闭包的作用:封装、复用代码。
闭包的特点是返回的函数还使用了外部函数的局部变量,所以要正确的使用闭包,就要确保引用的局部变量在函数返回后不能变。
例如:希望一次返回3个函数,分别计算1*1,2*2,3*3
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print f1() # 9
print f2() # 9
print f3() # 9
因为内部函数引用的外部函数的局部变量i在函数返回后值已经改变,所以此处返回的全是9。我们可以将f()函数先看成一个黑盒子,里面具体返回什么信息先不管。在调用函数count()时,i分别等于1、2、3,将3个函数添加到fs中并返回。此时i等于3。然后我们在分别调用3个刚刚返回的f()函数,注意,此时的i已经等于3了。再调用f1()、f2()、f3(),结果均为9。(此处比较抽象,建议先将内部函数f看成一个黑盒子,先不关心具体的内容。)
可以改写函数为:引用一个不变的局部变量。
def count(i):
def f():
return i*i
return f
f1 = count(1)
f2 = count(2)
f3 = count(3)
print f1(),f2(),f3() # 1 4 9
f1,f2,f3 = map(count,range(1,4))
print f1(),f2(),f3() # 1 4 9
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
r = f(i)
fs.append(r)
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()