Python中閉包的概念經常被提到,因為它是解決很多問題的一種有效方式。閉包簡單來說就是一個函數與它的環境變量的綁定。
def outer(x): def inner(y): return x + y return inner add_3 = outer(3) print(add_3(7)) # 10
上面的代碼是一個閉包的實現。在outer函數中定義了一個inner函數,并返回了inner。inner函數引用了outer函數中的x變量。當outer被調用時,返回一個inner函數,inner函數中的x變量與outer函數中的x變量綁定。創建add_3時,實際上就是調用outer(3),將outer中的x變量綁定為3,從而得到add_3函數。調用add_3(7),會調用inner函數,inner中的x變量已經與3綁定,所以返回的是3+7的結果。
閉包的一個好處是可以保存狀態。在一個函數中保存狀態可能不太容易,但閉包可以很方便地實現。比如在函數中使用一個額外的計數變量。
def counter(): cnt = 0 def inc(): nonlocal cnt # 聲明cnt是外部變量 cnt += 1 return cnt return inc c1 = counter() print(c1()) # 1 print(c1()) # 2
上面的代碼中,counter函數中定義了inc函數,并返回inc函數。當c1被定義時,調用counter函數,獲得inc函數,inc函數可以訪問counter中的cnt變量。通過調用c1,每次得到的結果都是cnt的一個自增值。
閉包可以被應用于很多場景,比如實現裝飾器、函數工廠、惰性求值等,掌握閉包的使用技巧可以極大地提高代碼的質量和效率。