1)函數(shù)作為返回值,調(diào)用函數(shù)f時(shí),才真正計(jì)算求和的結(jié)果:f()
2)請(qǐng)?jiān)僮⒁庖稽c(diǎn),當(dāng)我們調(diào)用lazy_sum()時(shí),每次調(diào)用都會(huì)返回一個(gè)新的函數(shù),即使傳入相同的參數(shù):
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
f1()和f2()的調(diào)用結(jié)果互不影響。
3)返回閉包時(shí)牢記的一點(diǎn)就是:返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。——解決方法是再創(chuàng)建一個(gè)函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無論該循環(huán)變量后續(xù)如何更改,已綁定到函數(shù)參數(shù)的值不變
舉例
前
def count():
? ? fs = []
? ? for i in range(1, 4):
? ? ? ? def f():
? ? ? ? ? ? return i*i
? ? ? ? fs.append(f) ?#注意到這里f是作為一個(gè)函數(shù)加入的
? ? return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
后:將變量和函數(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
fs.append(f(i))傳入的f(i)會(huì)首先被進(jìn)行函數(shù)計(jì)算,然后f(i)的返回值,也就是函數(shù)g作為fs.append()的參數(shù)傳入,所以最終傳入的參數(shù)是函數(shù)g,仍是一個(gè)函數(shù)。最終fs.append()接收到的參數(shù)是f(i)的返回值
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9