def closure_conf(prefix):
def innerFunc(name):
print prefix, name
return innerFunc
holiday = closure_conf("10月1日是:")
# holiday("國慶節")
print "function name is:", holiday.__name__
運作以後輸出為:
function name is: innerFunc
代碼分析:
我們先定義了一個函數closure_conf(prefix);在該函數内部我們嵌套了另一個函數innerFunc(name);在innerFunc函數中,我們調用了closure_conf的參數prefix(列印出來了);注意,closure_conf函數的傳回是innerFunc,是一個函數名,僅僅是函數名,而不是調用(如果你這麼寫:innerFunc(),就是調用了)。簡單來說,就是一個函數内嵌另一個函數,并且傳回内嵌函數的函數名。
接下來是我們調用closure_conf并且傳了一個參數,列印這個運作後的名字__name__。
一般來說運作什麼函數,就應該列印出的名字就是這個函數名,但是這裡我們發現列印的竟然是内嵌函數的名字,也就是說你給closure_conf傳遞了參數并運作時,函數變成了innerFunc,但是innerFunc并沒有運作,因為沒有列印innerFunc裡面的語句。如果放開注釋的語句,就發現可以運作innerFunc函數了。
在Python中建立一個閉包需要滿足以下三點:
- 閉包函數必須有内嵌函數
- 内嵌函數需要引用該嵌套函數上一級中的變量
- 閉包函數必須傳回内嵌函數