Python之閉包學習筆記

2021-07-09 23:14:00 字數 1164 閱讀 1139

走棋子是乙個很好的例子理解為什麼用閉包。

資料來自網易雲課堂

假設需求是給定一顆在[0,0]位置的棋子,使用者互動輸入移動方向與步數,寫乙個函式記錄棋子的位置變化。

這個函式可以是這樣的:以使用者輸入的方向與步數變數為引數,計算出移動後的位置值作為函式返回值。那麼走第一步時,基於初始位置值[0,0]做計算,返回新的位置值[a,b]。第二步呢?計算第二步走完之後的位置值需要基於[a,b]而不是[0,0]。也就是說,函式每呼叫一次,它的返回值都要儲存下來作為下一次呼叫的引數。當然全域性變數可以做到,但不是乙個好選擇。

採用閉包函式是這樣的:

參考了雲課堂『用python做些事』這門課程。

origin = [0, 0] # 座標系統原點

legal_x = [0, 50] # x軸方向的合法座標

legal_y = [0, 50] # y軸方向的合法座標

def create(pos):

def player(direction,step):

# 這裡應該首先判斷引數direction,step的合法性,比如direction不能斜著走,step不能為負等

# 然後還要對新生成的x,y座標的合法性進行判斷處理

new_x = pos[0] + direction[0]*step

new_y = pos[1] + direction[1]*step

pos[0] = new_x

pos[1] = new_y

#注意!此處不能寫成 pos = [new_x, new_y],原因在上文有說過

return pos

return player

player1 = create(origin[:]) # 建立棋子player1,起點為原點

print player1([1,0],10) # 向x軸正方向移動10步

print player1([0,1],20) # 向y軸正方向移動20步

print player1([-1,0],10) # 向x軸負方向移動10步

這個例子幫助我理解了閉包及其用處。

另外參考文章

其中兩點助於理解:

1.      內部巢狀的函式稱為閉包,它可以訪問不在自己作用域的變數,即外部函式的變數。

2.      閉包會保留來自外圍作用域變數的資訊。

python學習筆記 閉包

乙個函式a和乙個函式b,其中b函式位於a函式體內部,同時b函式體內呼叫了b函式之外,a函式之內的其他變數x 包括a中傳遞過來的引數 此時,x稱為b函式的環境變數,b函式和變數x就構成了乙個閉包。而函式b是需要返回的,也就是返回函式b,其中在返回的時候,對a引數x的呼叫也包括在了裡面,有點封閉包含的意...

Python學習筆記 閉包

在學習閉包之前,我們先要弄懂一件事兒。同理 test其實就是乙個變數,變數中存放著函式體的位址,就像a變數中存放著100的位址一樣。t test實質上就是淺拷貝行為。將變數test中的位址存放到變數t中 我們如果要呼叫test函式,test 當t獲取了函式體的位址後,同樣可以以t 的形式呼叫函式 注...

python筆記 閉包

閉包 在乙個外函式中定義了乙個內函式,內函式裡運用了外函式的臨時變數,並且外函式的返回值是內函式的引用。這樣就構成了乙個閉包。def fun1 x def fun2 y return x y return fun2 fun1 3 3 9 def outer a b 10 inner是內函式 def ...