Python 閉包

閉包的編寫套路:
def outer(a,b):  
    def inner(x):
        .......
        return ...
return inner
        
 
outer稱爲外函數
inner稱爲內函數,內函數inner使用了外函數outer的參數a,b。
外函數outer最終的返回值是內函數inner的引用。
 
閉包是Python實現面向對象的一種方式。
每調用一次外函數outer,就會產生一個對象;
n = outer(4,6)
m = outer(5,3)
n 和 m 就是兩個不一樣的對象。若是這個函數是用來計算二元一次方程的話,那麼 n 和 m 就是兩條不一樣的直線。
 
調用不一樣對象的內函數就能夠對不一樣對象進行操做了。
對 n 對象進行操做:
print(n(9))  # 由於outer()函數的返回值是內函數inner的引用 --> 它被賦給了 n 這個變量,因此直接調用 n 就至關於調用了 outer(4,6) 這個外函數裏的 inner() 
假如這個函數是用來求解二元一次方程的,那麼 outer(4,6) 就至關於建立了 4X+6 這條直線(對象),而調用 n(9) 就至關於把 X=9 帶入這個式子進行計算,獲得的結果就是 42 了。
 
每次調用 n(?) 都是調用了 outer(4,6)裏的 inner(?) ,inner(?) 使用了 outer(4,6)裏的參數 4 和 6 。做爲內函數是能夠任意使用外函數的變量的。
可是,若是要修改外函數的變量的話,有 2 個方法:
1)在修改以前須要用 nonlocal 關鍵字聲明變量,表示須要向上一層變量空間找這個變量。
2)把 閉包變量 改爲 可變類型,好比 列表 。
 
代碼實例:
 1 def counter(first = 0):
 2     cnt = [0]
 3     def add_one():
 4         cnt[0]+=1
 5         return cnt[0]
 6     return add_one
 7 
 8 num5 = counter(5)
 9 print(num5())
10 print(num5())
11 print(num5())
12 print(num5())
13 print(num5())

運行結果:閉包

 
是什麼將內函數與外函數牢牢聯繫在一塊兒,是外函數的參數。外函數的參數是實現面向對象的本質。不一樣的外函數參數建立了不一樣的對象。
內函數是能夠任意使用外函數的參數和變量的,在上面這個例子中,外函數有一個變量 cnt 和一個參數 first,內函數只使用了 變量 cnt ,那麼內函數是怎麼對外函數參數產生的對象進行操做的呢?在外函數使用不一樣的參數產生多個對象的時候,內函數是如何識別不一樣的對象並分別對它們進行操做的呢?
num5 = counter(5)
 
num6 = counter(6)
 
num7 = counter(7)
 
#上面就產生了三個不一樣的對象了,它們分別是這樣調用內函數的:
num5()
 
num6()
 
num7()
 
#所以答案揭曉:經過將 不一樣對象 賦給 不一樣的變量(num5,num6,num7),再經過調用這幾個變量,就能夠實現分別對 不一樣的對象 調用內函數了
相關文章
相關標籤/搜索