关于返回函数即返回值为函数
关于闭包:是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造的环境也不例外
先看一个例子,分析闭包的:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
分别执行 f1(),f2(),f3()后返回的结果均为9
分析:例子中fs存储的是函数,每次都创建一个新的函数,函数中的i取自count()中for循环的i,在执行最后一句赋值后,将三个函数分别赋给f1,f2,f3;只有当执行f1()后,才会执行该函数,同时取出变量i,这个变量指向的是for存储的变量,当for语句执行完后,此i变量不会消失(这是Python的特性,见http://python.jobbole.com/81274/)
为了判断创建的f函数没有存储i,而是存储i的引用,可以在return fs前面加上一句,如下所示:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
print(i)
i=i+2
return fs
然后执行,输出f1()的结果是25,显然i的值变为了5,那么就可以得出在f()函数确实没有存储i,那么如何将i存入,而不让i的结果随着i的变化而变化呢,这需要存储i的值而不是i的引用,使用参数,但是为了存储函数,需要另定义函数,如下:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
return fs