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)返回閉包時牢記的一點就是:返回函數不要引用任何循環變量,或者后續會發生變化的變量。——解決方法是再創建一個函數,用該函數的參數綁定循環變量當前的值,無論該循環變量后續如何更改,已綁定到函數參數的值不變
舉例
前
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)立刻被執行,因此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