1)函數作為返回值背苦,調用函數f時渊胸,才真正計算求和的結果:f()
2)請再注意一點捣炬,當我們調用lazy_sum()時溶弟,每次調用都會返回一個新的函數,即使傳入相同的參數:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
f1()和f2()的調用結果互不影響蒲稳。
3)返回閉包時牢記的一點就是:返回函數不要引用任何循環(huán)變量氮趋,或者后續(xù)會發(fā)生變化的變量伍派。——解決方法是再創(chuàng)建一個函數剩胁,用該函數的參數綁定循環(huán)變量當前的值诉植,無論該循環(huán)變量后續(xù)如何更改,已綁定到函數參數的值不變
舉例
前
def count():
? ? fs = []
? ? for i in range(1, 4):
? ? ? ? def f():
? ? ? ? ? ? return i*i
? ? ? ? fs.append(f) ?#注意到這里f是作為一個函數加入的
? ? return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
后:將變量和函數綁定
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的當前值被傳入f()
? ? ?return fs
fs.append(f(i))傳入的f(i)會首先被進行函數計算晾腔,然后f(i)的返回值,也就是函數g作為fs.append()的參數傳入索昂,所以最終傳入的參數是函數g建车,仍是一個函數。最終fs.append()接收到的參數是f(i)的返回值
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9