乙個函式a和乙個函式b,其中b函式位於a函式體內部,同時b函式體內呼叫了b函式之外,a函式之內的其他變數x(包括a中傳遞過來的引數),此時,x稱為b函式的環境變數,b函式和變數x就構成了乙個閉包。而函式b是需要返回的,也就是返回函式b,其中在返回的時候,對a引數x的呼叫也包括在了裡面,(有點封閉包含的意思,可能因此叫閉包)。此時a稱為閉包函式
eg:#outer function
def funcb():
y=10
def funca(x):
return x+y
return funca
此時funca構成了乙個閉包,而當呼叫的時候:
y=20
a=funcb()
print a(1),則輸出11,即使外部定義了y也沒用,因為對於funca來說,其外部環境是funcb。
使用閉包建立了一種泛函式,這種泛函式具有一定的性質,那就是該函式一部分是可以按照一種形式變化,而另一部分是需要按照既定的規則(環境變數中定義的內容)來進行變化的。
比如說上面的例子,就實際上定義了一種情況:返回乙個表示式 10+x,其中x可以隨便變化,但是10是保持不變的。-------由此想到了另一種閉包的情況,也就是y也是變化的,那麼此時y可以設定為funcb的引數,如下所示:
#outer function
def funcb(y):
def funca(x):
return x+y
return funca
此時,確定了一種形式的閉包,也就是必須x,y之間是加法,雖然x,y都可以隨便變化,但是加法這種運算不可以變化,不知道是否還可以繼續擴充套件….,我感覺應該還可以繼續擴充套件,畢竟,運算型別也可以以引數的形式傳入(不過此時可能需要進行運算型別的判斷,這樣就隱含了一種情況也就是說,可能運算型別是確定的有限的幾種型別,不知道是否可以進一步將運算型別進行擴充套件,這樣就可以自己定義運算型別了,繼續擴充套件…)。
閉包有效減少了傳遞引數的個數。
Python學習筆記 閉包
在學習閉包之前,我們先要弄懂一件事兒。同理 test其實就是乙個變數,變數中存放著函式體的位址,就像a變數中存放著100的位址一樣。t test實質上就是淺拷貝行為。將變數test中的位址存放到變數t中 我們如果要呼叫test函式,test 當t獲取了函式體的位址後,同樣可以以t 的形式呼叫函式 注...
Python之閉包學習筆記
走棋子是乙個很好的例子理解為什麼用閉包。資料來自網易雲課堂 假設需求是給定一顆在 0,0 位置的棋子,使用者互動輸入移動方向與步數,寫乙個函式記錄棋子的位置變化。這個函式可以是這樣的 以使用者輸入的方向與步數變數為引數,計算出移動後的位置值作為函式返回值。那麼走第一步時,基於初始位置值 0,0 做計...
python筆記 閉包
閉包 在乙個外函式中定義了乙個內函式,內函式裡運用了外函式的臨時變數,並且外函式的返回值是內函式的引用。這樣就構成了乙個閉包。def fun1 x def fun2 y return x y return fun2 fun1 3 3 9 def outer a b 10 inner是內函式 def ...