python~閉包詳解
阿新 • • 發佈:2019-01-05
構成閉包的必要條件:一個函式中有一個子函式,且子函式引用了函式的變數
簡單的說,就是某個內部函式被當做物件返回時,夾帶了這個內部函式之外的變數,這就形成了一個閉包;下面通過三個程式碼例項來體會閉包的感覺!
程式碼示例一:不帶引數
def outer(): name="python" def inter(): print (name) return inter result=outer() print (result.__closure__) #其實閉包函式相對與普通函式會多出一個closure的屬性,裡面定義了一個元組用於存放所有的cell物件,每個cell物件一一儲存了這個閉包中所有的外部變數。 #所以可見,一旦形成閉包之後,python會將__closure__和閉包函式繫結作為儲存閉包變數的場所。 result()
程式碼示例二:
def outer():
name="python"
age=25
def inter():
print (age) #若不引用外部變數age,在列印__closure__屬性時就會少一個
print (name)
return inter
result=outer()
print (result.__closure__)
result()
程式碼示例三:帶引數
def func(name): nameList=["gang","yu"] nameList.append(name) print ("名字如下:") def sonFunc(): for i in nameList: print (i) return sonFunc res=func("zhi") print (type(res)) print (res.__closure__) res()
執行上面的例子後,其實我們自己就可以總結出在python語言中形成閉包的三個條件,缺一不可:
1. 必須有一個內嵌函式(函式裡定義的函式) -->這對應函式之間的巢狀
2. 內嵌函式必須引用一個定義在閉合範圍內(外部函式裡)的變數 -->內部函式引用外部變數
3. 外部函式必須返回內嵌函式 -->必須返回那個內部函式
裝飾器的原理就是一個閉包,把一個函式當作引數後返回一個替代版函式。沒錯,這裡介紹閉包就是為下面的裝飾器講解做鋪墊的,先多練習下吧