1. 程式人生 > >python~閉包詳解

python~閉包詳解

構成閉包的必要條件:一個函式中有一個子函式,且子函式引用了函式的變數

簡單的說,就是某個內部函式被當做物件返回時,夾帶了這個內部函式之外的變數,這就形成了一個閉包;下面通過三個程式碼例項來體會閉包的感覺!

程式碼示例一:不帶引數

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. 外部函式必須返回內嵌函式         -->必須返回那個內部函式

裝飾器的原理就是一個閉包,把一個函式當作引數後返回一個替代版函式。沒錯,這裡介紹閉包就是為下面的裝飾器講解做鋪墊的,先多練習下吧