函數(shù)身為第一類(lèi)對(duì)象,它可以作為函數(shù)的返回值返回,現(xiàn)在我們來(lái)考慮如下的例子:
defprint_msg():
#print_msg是外圍函數(shù)
msg="zenofpython"
defprinter():
#printer是嵌套函數(shù)
print(msg)
returnprinteranother=print_msg()#輸出zenofpythonanother()
這段代碼和前面例子的效果完全一樣,同樣輸出"zenofpython"。不同的地方在于內(nèi)部函數(shù)printer直接作為返回值返回了。
一般情況下,函數(shù)中的局部變量?jī)H在函數(shù)的執(zhí)行期間可用,一旦print_msg()執(zhí)行過(guò)后,我們會(huì)認(rèn)為msg變量將不再可用。然而,在這里我們發(fā)現(xiàn)print_msg執(zhí)行完之后,在調(diào)用another的時(shí)候msg變量的值正常輸出了,這就是閉包的作用,閉包使得局部變量在函數(shù)外被訪問(wèn)成為可能??赐赀@個(gè)例子,我們?cè)賮?lái)定義閉包,維基百科上的解釋是:
在計(jì)算機(jī)科學(xué)中,閉包(Closure)是詞法閉包(LexicalClosure)的簡(jiǎn)稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這
個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)
體。
這里的another就是一個(gè)閉包,閉包本質(zhì)上是一個(gè)函數(shù),它有兩部分組成,printer函數(shù)和變量msg。閉包使得這些變量的值始終保存在內(nèi)存中。
閉包,顧名思義,就是一個(gè)封閉的包裹,里面包裹著自由變量,就像在類(lèi)里面定義的屬性值一樣,自由變量的可見(jiàn)范圍隨同包裹,哪里可以訪問(wèn)到這個(gè)包裹,哪里就可以訪問(wèn)到這個(gè)自由變量。
以上內(nèi)容為大家介紹了python培訓(xùn)之閉包函數(shù)是什么,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。