用閉包解決行走距離問題

2021-08-26 05:56:42 字數 1402 閱讀 5988

假設起點從x=0開始。

走了3步,列印的結果result = 3

再走了5步,列印的結果是result = 8

又走了6步,列印的結果是result = 14

先用非閉包函式實現:

x = 0

defgo

(step):

global x

new_pos = x + step

x = new_pos

return x

print(go(3))

print(go(5))

print(go(6))

---------------------------------------------

輸出:3

814

這裡為什麼要用global關鍵字來定義變數x為全域性變數呢?這是因為`在go函式內部出現了x = new_pos,而python會認為等號左邊的變數是乙個區域性變數。如果沒有使用global關鍵字來定義x為全域性變數的話,new_pos = x + step這行是會報錯的。就會未定義x變數。

在函式內部定義乙個全域性變數這個做法是不好的,因為全域性變數是很容易被其他函式改變的。現在用閉包來實現

origin = 0

deffactory

(pos):

defgo

(step):

nonlocal pos

new_pos = pos +step

pos = new_pos

return new_pos

return go

f = factory(origin)

print(f(3))

print(f(5))

print(f(6))

----------------------------------

輸出:3

814

注意,用了nonlocal關鍵字來宣告pos變數不是本地的乙個區域性變數。

閉包的環境變數有儲存現場的乙個功能,它可以記憶上一次呼叫的狀態。

定義的變數origin的變數並沒有被改變。

閉包 解決閉包問題

1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...

用陣列理解閉包

閉包 乙個函式可以把自己內部的語句,和自己宣告時所處的作用域封裝在乙個密閉的環境中 函式在定義時,能夠記住自己函式體以及所處的外部環境 每個函式都是閉包,每個函式天生能記住自己定義時所處的作用域環境。這是乙個陣列,陣列中有10個函式,目的 想要輸出函式的角標,也就是說arr 0 彈出0 arr 2 ...

js閉包問題以及解決辦法

個人理解閉包的產生主要就是 一切最外部的函式比裡面的函式先執行,必然產生閉包,閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏 解析 實現上現在的demo儲存的是function b a執行之後就銷魂了自身的ao,但是此時b已經儲存了a的ao 解析 為什麼可以列印出123?因為函式內部的b函式並沒有執...