1. 程式人生 > >python函數嵌套以及閉包的原理

python函數嵌套以及閉包的原理

一點 才會 解析器 http 標識 -- return 將不 定義

變量相關—嵌套函數

python允許創建嵌套函數。也就是說我們可以在函數裏面定義函數,而且現有的作用域和變量生存周期依舊不變。

例子:

#encoding=utf-8

def outer():
name="python"

def inner():#outer函數內部定義的函數
print name
return inner()#返回該內部函數

outer()

結果:

技術分享圖片

理解:

在inner函數中,python解析器需要找一個叫name的本地變量,查找失敗後會繼續在上層的作用域裏面尋找,這個上層作用域定義在outer函數裏,python函數可以訪問封閉作用域。

對於outer函數中最後一句,返回inner函數調用的結果,需要知道非常重要一點就是,inner也僅僅是一個遵循python變量解析規則的變量名,python解釋器會優先在outer的作用域裏面對變量名inner查找匹配的變量。

把恰好是函數標識符的變量inner作為返回值返回回來,每次函數outer被調用的時候,函數inner都會被重新定義,如果它不被當做變量返回的話,每次執行過後它將不復存在。

在python裏,函數就是對象,它也只是一些普通的值而已。也就是說你可以把函數像參數一樣傳遞給其他的函數或者說從函數了裏面返回函數

return內層函數時不加括號,只返回函數的地址:

代碼:

#encoding=utf-8

def outer():
name="python"

def inner():#outer函數內部定義的函數
return name
return inner#返回該內部函數

print outer()

結果:

技術分享圖片

此時執行外層函數outer(),返回的是內層函數的函數引用(函數名稱)--inner,想要執行內層函數,需要在outer()後邊再加個括號,即outer()(),才會讓內層函數執行

代碼:

#encoding=utf-8

def outer():
name="python"

def inner():#outer函數內部定義的函數
return name
return inner#返回該內部函數

print outer()()

結果:

技術分享圖片

python函數嵌套以及閉包的原理