Python: Closure
- 什麼是閉包?
- 為什麼要閉包?
-
- 儲存參數
- 與 @ 的關系
什麼是閉包?
滿足下列三個條件的:
- 函數裡面嵌套另一個函數
- 内層函數引用了外層函數的變量
- 外層函數的傳回值是内層函數
那麼這個傳回的函數就是閉包.
舉個例子:
def outer(foo):
def inner():
print(foo)
return inner
closure = outer('hi') # 這個 closure 就是一個閉包
closure()
# 輸出 hi
為什麼要閉包?
儲存參數
函數的行為由參數決定, 有時候我們需要重複調用同一函數, 而且 每次調用的時候很多參數都是一樣的, 那麼這時候可以通過閉包來達到儲存參數的作用.
舉個例子:
def print_with_prefix(prefix):
def _(*argv):
print(prefix, *argv)
return _
sharp = print_with_prefix('# ')
sharp('hi', 'how are you')
bang = print_with_prefix('! ')
bang('hihi', 'im fine')
有點類似 JavaScript 的 bind 函數…
與 @ 的關系
@修飾符是閉包的延伸.
因為閉包相當于一個經過加工的函數, 外層函數的作用主要是預處理, 内層函數 (閉包) 裡存放的是核心邏輯. 是以, 如果有一個第三方或者你自己提前寫好的外層函數, 你可以通過 @ 修飾符直接将被修飾的函數作為閉包嵌套進外部函數中去.