函數(shù)嵌套python例子,函數(shù)嵌套 python

Python嵌套函數(shù)和閉包

在Python語(yǔ)言中,可以在函數(shù)中定義函數(shù)。 這種在函數(shù)中嵌套定義的函數(shù)也叫內(nèi)部函數(shù)。我們來(lái)看下面的代碼:

成都創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)公司、網(wǎng)頁(yè)設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站推廣、小程序App開(kāi)發(fā)等移動(dòng)開(kāi)發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都發(fā)電機(jī)租賃等眾行業(yè)中小客戶(hù)提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開(kāi)發(fā)服務(wù)。

上述代碼中,定義了函數(shù)greet,在函數(shù)greet內(nèi)部又定義了一個(gè)函數(shù)inner_func, 并調(diào)用該函數(shù)打印了一串字符。

我們可以看到,內(nèi)部函數(shù)inner_func的定義和使用與普通函數(shù)基本相同。需要注意的是變量的作用域,在上述代碼中,函數(shù)參數(shù)name對(duì)于全局函數(shù)greet是局部變量,對(duì)內(nèi)部函數(shù)inner_func來(lái)說(shuō)則是非局部變量。內(nèi)部函數(shù)對(duì)于非局部變量的訪(fǎng)問(wèn)規(guī)則類(lèi)似于標(biāo)準(zhǔn)的外部函數(shù)訪(fǎng)問(wèn)全局變量。

從這個(gè)例子我們還可以看到內(nèi)部函數(shù)的一個(gè)作用,就是通過(guò)定義內(nèi)部函數(shù)的方式將一些功能隱藏起來(lái),防止外部直接調(diào)用。常見(jiàn)的場(chǎng)景是,在一個(gè)復(fù)雜邏輯的函數(shù)中,將一些小的任務(wù)定義成內(nèi)部函數(shù),然后由這個(gè)外層函數(shù)使用,這樣可以使代碼更為清晰,易于維護(hù)。這些內(nèi)部函數(shù)只會(huì)在這個(gè)外層函數(shù)中使用,不能被其他函數(shù)或模塊使用。

在Python語(yǔ)言中, 函數(shù)也是對(duì)象,它可以被創(chuàng)建、賦值給變量,或者作為函數(shù)的返回值。我們來(lái)看下面這個(gè)例子。

在上述代碼中,在函數(shù)gen_greet內(nèi)部定義了inner_func函數(shù),并返回了一個(gè)inner_func函數(shù)對(duì)象。外部函數(shù)gen_greet返回了一個(gè)函數(shù)對(duì)象,所以像gen_greet這樣的函數(shù)也叫工廠(chǎng)函數(shù)。

在內(nèi)部函數(shù)inner_func中,使用了外部函數(shù)的傳參greet_words(非局部變量),以及函數(shù)的參數(shù)name(局部變量),來(lái)打印一個(gè)字符串。

接下來(lái),調(diào)用gen_greet("Hello")創(chuàng)建一個(gè)函數(shù)對(duì)象say_hello,緊接著調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hello, Mr. Zhang!

同樣的,調(diào)用gen_greet("Hi")創(chuàng)建一個(gè)函數(shù)對(duì)象say_hi,調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hi,Tony!

我們可以發(fā)現(xiàn),gen_greet返回的函數(shù)對(duì)象具有記憶功能,它能夠把所需使用的非局部變量保存下來(lái),用于后續(xù)被調(diào)用的時(shí)候使用。這種保存了非局部變量的函數(shù)對(duì)象被稱(chēng)作閉包(closure)。

那么閉包是如何實(shí)現(xiàn)的呢?其實(shí)并不復(fù)雜,函數(shù)對(duì)象中有一個(gè)屬性__closure__,它就是在創(chuàng)建函數(shù)對(duì)象時(shí)用來(lái)保存這些非局部變量的。

__closure__屬性是一個(gè)元組或者None類(lèi)型。在上述代碼中,我們可以通過(guò)下面方式查看:

函數(shù)的嵌套所實(shí)現(xiàn)的功能大都可以通過(guò)定義類(lèi)的方式來(lái)實(shí)現(xiàn),而且類(lèi)是更加面向?qū)ο蟮拇a編寫(xiě)方式。

嵌套函數(shù)的一個(gè)主要用途是實(shí)現(xiàn)函數(shù)的裝飾器。我們看下面的代碼:

在上述代碼中,logger函數(shù)返回函數(shù)with_logging,with_logging則是打印了函數(shù)func的名稱(chēng)及傳入的參數(shù),然后調(diào)用func, 并將參數(shù)傳遞給func。其中的@wraps(func)語(yǔ)句用于復(fù)制函數(shù)func的名稱(chēng)、注釋文檔、參數(shù)列表等等,使得with_logging函數(shù)具有被裝飾的函數(shù)func相同的屬性。

代碼中接下來(lái)用@logger對(duì)函數(shù)power_func進(jìn)行修飾,它的作用等同于下面的代碼:

可見(jiàn),裝飾器@符其實(shí)就是上述代碼的精簡(jiǎn)寫(xiě)法。

通過(guò)了解了嵌套函數(shù)和閉包的工作原理,我們?cè)谑褂眠^(guò)程中就能夠更加得心應(yīng)手了。

關(guān)于python 函數(shù)嵌套

因?yàn)樽詈蟮哪蔷鋜eturn nested。

tester()()會(huì)自動(dòng)調(diào)用它的返回值,而此時(shí)的返回值為nested,即def nested()這個(gè)函數(shù),所以自然而然執(zhí)行到了里面的print語(yǔ)句。

你可以試試把最后那就return nested改成其他的如return nestedxxx,再tester()()時(shí)就會(huì)報(bào)錯(cuò)了。

另外,在python里對(duì)于方法ester和nested是沒(méi)有tester().nested()這種用法的,所以這樣輸入肯定報(bào)錯(cuò)的,如果ester和nested是類(lèi)(class)的話(huà)才有這種寫(xiě)法。

希望對(duì)你有所幫助~~

Python-嵌套函數(shù)中的局部變量?

嵌套函數(shù)在執(zhí)行時(shí)(而不是在定義時(shí))從父范圍中查找變量。

編譯函數(shù)主體,然后驗(yàn)證“自由”變量(未在函數(shù)本身中通過(guò)賦值定義),然后將其作為閉包單元綁定到函數(shù),并且代碼使用索引引用每個(gè)單元格。pet_function因此具有一個(gè)自由變量(cage),然后將其通過(guò)一個(gè)閉合單元引用,索引為0的閉合本身指向局部變量cage在get_petters功能。

當(dāng)你實(shí)際調(diào)用該函數(shù)時(shí),該閉包將用于在你調(diào)用該函數(shù)時(shí)查看cage周?chē)饔糜蛑械闹怠?wèn)題就在這里。在你調(diào)用函數(shù)時(shí),該函數(shù)已經(jīng)完成了對(duì)其結(jié)果的計(jì)算。將在在執(zhí)行過(guò)程中的一些點(diǎn)局部變量分配各的,和字符串,但在功能的結(jié)束,包含了最后一個(gè)值。因此,當(dāng)你調(diào)用每個(gè)動(dòng)態(tài)返回的函數(shù)時(shí),就會(huì)得到打印的值。get_petterscage'cow''dog''cat'cage'cat''cat'

解決方法是不依賴(lài)閉包。你可以改用部分函數(shù),創(chuàng)建新的函數(shù)作用域或?qū)⒆兞拷壎殛P(guān)鍵字parameter的默認(rèn)值。

部分函數(shù)示例,使用functools.partial():

from functools import partialdef pet_function(cage=None):

print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, partial(pet_function, cage=cage)))

創(chuàng)建一個(gè)新的范圍示例:

def scoped_cage(cage=None):

def pet_function():

print "Mary pets the " + cage.animal + "."

return pet_functionyield (animal, partial(gotimes, scoped_cage(cage)))

將變量綁定為關(guān)鍵字參數(shù)的默認(rèn)值:

def pet_function(cage=cage):

print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, pet_function))

無(wú)需scoped_cage在循環(huán)中定義函數(shù),編譯僅進(jìn)行一次,而不是在循環(huán)的每次迭代中進(jìn)行。

Python菜鳥(niǎo)求助 函數(shù)的嵌套問(wèn)題

我怎么就變成大神了【笑哭】

def?A(a):

#這個(gè)下面有個(gè)TAB,就是為了讓下面的語(yǔ)句跟著你定義的這個(gè)A函數(shù)

print('i\'m?A')

#這下面的縮進(jìn)是在A(yíng)函數(shù)里定義一個(gè)B函數(shù)

def?B(b):

#到這里的縮進(jìn)就是B函數(shù)的范圍了

print('i\'m?b')

print('a+b=',a+b)

#由于不跟著B(niǎo)函數(shù)的縮進(jìn),所以下面的這個(gè)B是A函數(shù)的范圍

B(3)

print('Done!')

A(5)

#樓主才剛學(xué)幾天呀

python 函數(shù)嵌套

函數(shù)a返回的是一個(gè)函數(shù)對(duì)象,c = a(3)那么c是一個(gè)函數(shù)b對(duì)象,可以調(diào)用,c(2)則調(diào)用此函數(shù),函數(shù)的內(nèi)容是計(jì)算x+y然后返回,x來(lái)自于外層閉包a(3)中的參數(shù)3,y來(lái)自于c(2)中的參數(shù)2,故2+3=5,返回5。

文章名稱(chēng):函數(shù)嵌套python例子,函數(shù)嵌套 python
分享網(wǎng)址:http://muchs.cn/article20/phioco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站維護(hù)、響應(yīng)式網(wǎng)站網(wǎng)站營(yíng)銷(xiāo)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)