天天看點

【python】閉包閉包

閉包

1. 閉包的介紹

當函數調用完,函數内定義的變量都銷毀了,但是我們有時候需要儲存函數内的這個變量,每次在這個變量的基礎上完成一些列的操作,比如: 每次在這個變量的基礎上和其它數字進行求和計算,那怎麼辦呢?

閉包的定義:

在函數嵌套的前提下,内部函數使用了外部函數的變量,并且外部函數傳回了内部函數,這個使用外部函數變量的内部函數稱為閉包。

2. 閉包的構成條件

通過閉包的定義,我們可以得知閉包的形成條件:

  1. 在函數嵌套(函數裡面再定義函數)的前提下
  2. 内部函數使用了外部函數的變量(還包括外部函數的參數)
  3. 外部函數傳回了内部函數

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. 閉包标準格式

  1. 當傳回的内部函數使用了外部函數的變量就形成了閉包
  2. 閉包可以對外部函數的變量進行儲存
  3. 實作閉包的标準格式:
# 外部函數
 def test1(a):
     b = 10
     # 内部函數
     def test2():
         # 内部函數使用了外部函數的變量或者參數
         print(a, b)
     # 傳回内部函數, 這裡傳回的内部函數就是閉包執行個體
     return test2