------------------
首先根據例項, 體會一下閉包的效果
------------------
定義閉包:
def foo(x):
a = [0]
def bar(y):
a[0] = a[0]*x + y
print(a[0])
return a[0]
return bar
使用閉包
f=foo(1)
f(2) #print 2
f(2) #print 4
f(2) #print 6
------------------
閉包要達到的目的
------------------
普通函式, 輸入給定後, 輸出總是一定的, 比如add(1,2), 無論呼叫多少次, 結果永遠是3。
閉包則不同, 在函式在執行後, 有能力保持函式執行後的環境, 為下次閉包的執行營造一個新的環境.
典型的為了閉包而閉包的情形有:
1. 看起來像閉包, 實際上並不具持久化的程式碼,.
2. 看起來像閉包, 實際上卻使用了global變數來支援持久化.
------------------
閉包的意義
------------------
一句話,類是包含行為的資料,閉包是有資料的行為。一般情況下,我們完全可以使用全域性變數+函式來實現持久化,或者寫個類,可讀性比閉包好多了。
閉包的作用, 摘自http://www.gracecode.com/posts/2385.html
setTimeout/setInterval
回撥函式(callback)
事件控制程式碼(event handle)
------------------
閉包模板
------------------
##閉包的定義模板
def foo(x):
a = [0] #宣告一個local變數來支援持久化, 因為python2不支援nonlocal, 所以這裡用了list, 而不是a=0
def bar(y):
a[0] = a[0]*x + y #修改local變數的值, 因為python2不支援nonlocal, 所以賦值給了a[0]而不是a
print(a[0])
return a[0] #內部函式一定要返回持久化變數, 這裡可返回a[0]或a
return bar #外部函式一定是返回內部函式
##閉包的使用模板
f=foo(1) #定義一個閉包, 就像例項化一個類一樣, 引數要符合外部函式簽名
f(2) #執行閉包, 就像呼叫某個函式一樣, 引數要符合內部函式簽名