返回函數(shù)
顧名思義,函數(shù)可以作為返回值進(jìn)行返回;
但是我們持有返回的函數(shù)有什么樣的用處呢?
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
這時(shí)當(dāng)我們調(diào)用lazy_sum()時(shí),返回的并不是求和結(jié)果,而是求和函數(shù):
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
調(diào)用函數(shù)f時(shí),才真正計(jì)算求和的結(jié)果:
>>> f()
25
閉包
返回閉包時(shí)牢記一點(diǎn):返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。
如果一定要引用循環(huán)變量怎么辦?方法是再創(chuàng)建一個(gè)函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無(wú)論該循環(huán)變量后續(xù)如何更改,已綁定到函數(shù)參數(shù)的值不變:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被執(zhí)行,因此i的當(dāng)前值被傳入f()
return fs
結(jié)果
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9