高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
比如:求和
def lazy_sum(*args):
def sum():
ax = 0
for n in x args:
ax = ax +n
return ax
return sum
当我们调用lazy_sum()时,返回的不是求和结果,而是求和函数:
>>> f = lazy_sum(1,3,5,7,9)
>>>f
<function lazy_sum…>
调用函数f时,才真正计算求和的结果:
>>>f()
25
在这个例子中,我们在函数lazy_sum定义了sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回sum时,相关参数和变量都保存在返回的函数中,这种称为闭包。
另外,需要注意的问题,返回的函数并没有立刻执行,直到调用了f()才执行。
比如:
def count():
fs[]
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3 = count()
上面的例子,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
>>>f1()
9
>>>f2()
9
>>>f3()
9
全部是9,原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,他们所引用的变量i已经变成了3,因此最终的结果为9
返回闭包时需要牢记一点:返回函数就不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要更改循环变量呢?
可以在创建一个函数,用该函数的参数绑定循环变量当前的值。
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
f1,f2,f3 = count()
输出结果:
>>>f1()
1
>>>f2()
4
>>>f3()
9
小结:
一个函数可以返回计算结果,也可以返回一个函数
返回函数时,牢记该函数并未执行,返回函数中不要任何可能变化的变量。