如果在A函數中定義了一個B函數,那麼我們要如何調用這個B函數呢?
這裏就引入了閉包這個概念。
滿足閉包的三個條件:
- 在函數中有嵌套函數
- 外層函數的返回值是內層嵌套函數的函數名
- 內層函數對外部作用域有非全局變量的引用,即使用外層函數的參數或者是外層函數定義的變量
這樣說了可能還是不太清楚,具體示例如下:
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()中的內容。
以上代碼滿足了閉包的三個條件:
- func()中有嵌套函數inner()
- func()的返回值是 inner()的函數名,而並非 inner() 的實現
- inner()中調用的是func() 接收的參數,而非外部的全局變量