【Python】閉包

如果在A函數中定義了一個B函數,那麼我們要如何調用這個B函數呢?
這裏就引入了閉包這個概念。

滿足閉包的三個條件:

  1. 在函數中有嵌套函數
  2. 外層函數的返回值是內層嵌套函數的函數名
  3. 內層函數對外部作用域有非全局變量的引用,即使用外層函數的參數或者是外層函數定義的變量

這樣說了可能還是不太清楚,具體示例如下:

def func(num):
    print('這是外層函數的輸出')
    def inner():
        print(F'調用外層函數的參數{num}')
        print('這是內層函數的輸出')
    return inner

f = func(3)
print(f)
print(f())

結果:

這是外層函數的輸出
<function func.<locals>.inner at 0x00000152434D02F0>
調用外層函數的參數3
這是內層函數的輸出
None

第一行 實例化func(),所以輸出了func外層函數的print內容。
第二行輸出func()的實例化對象f,發現f其實是func內部的嵌套函數inner對象
第三行則是調用inner方法,於是輸出了inner()中的內容。

以上代碼滿足了閉包的三個條件:

  1. func()中有嵌套函數inner()
  2. func()的返回值是 inner()的函數名,而並非 inner() 的實現
  3. inner()中調用的是func() 接收的參數,而非外部的全局變量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章