閉包
1. 閉包的介紹
當函數調用完,函數内定義的變量都銷毀了,但是我們有時候需要儲存函數内的這個變量,每次在這個變量的基礎上完成一些列的操作,比如: 每次在這個變量的基礎上和其它數字進行求和計算,那怎麼辦呢?
閉包的定義:
在函數嵌套的前提下,内部函數使用了外部函數的變量,并且外部函數傳回了内部函數,這個使用外部函數變量的内部函數稱為閉包。
2. 閉包的構成條件
通過閉包的定義,我們可以得知閉包的形成條件:
- 在函數嵌套(函數裡面再定義函數)的前提下
- 内部函數使用了外部函數的變量(還包括外部函數的參數)
- 外部函數傳回了内部函數
3. 簡單閉包的示例代碼
# 定義一個外部函數
def func_out(num1):
# 定義一個内部函數
def func_inner(num2):
# 内部函數使用了外部函數的變量(num1)
result = num1 + num2
print("結果是:", result)
# 外部函數傳回了内部函數,這裡傳回的内部函數就是閉包
return func_inner
# 建立閉包執行個體
f = func_out(1)
# 執行閉包
f(2)
f(3)
運作結果:
結果是: 3
結果是: 4
閉包執行結果的說明:
通過上面的輸出結果可以看出閉包儲存了外部函數内的變量num1,每次執行閉包都是在num1 = 1 基礎上進行計算。
4. 閉包的作用
- 閉包可以儲存外部函數内的變量,不會随着外部函數調用完而銷毀。
注意點:
- 由于閉包引用了外部函數的變量,則外部函數的變量沒有及時釋放,消耗記憶體。
5. 閉包标準格式
- 當傳回的内部函數使用了外部函數的變量就形成了閉包
- 閉包可以對外部函數的變量進行儲存
- 實作閉包的标準格式:
# 外部函數
def test1(a):
b = 10
# 内部函數
def test2():
# 内部函數使用了外部函數的變量或者參數
print(a, b)
# 傳回内部函數, 這裡傳回的内部函數就是閉包執行個體
return test2