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

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)越城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
tester()()會(huì)自動(dòng)調(diào)用它的返回值,而此時(shí)的返回值為nested,即def nested()這個(gè)函數(shù),所以自然而然執(zhí)行到了里面的print語句。
你可以試試把最后那就return nested改成其他的如return nestedxxx,再tester()()時(shí)就會(huì)報(bào)錯(cuò)了。
另外,在python里對于方法ester和nested是沒有tester().nested()這種用法的,所以這樣輸入肯定報(bào)錯(cuò)的,如果ester和nested是類(class)的話才有這種寫法。
希望對你有所幫助~~
在Python語言中,可以在函數(shù)中定義函數(shù)。 這種在函數(shù)中嵌套定義的函數(shù)也叫內(nèi)部函數(shù)。我們來看下面的代碼:
上述代碼中,定義了函數(shù)greet,在函數(shù)greet內(nèi)部又定義了一個(gè)函數(shù)inner_func, 并調(diào)用該函數(shù)打印了一串字符。
我們可以看到,內(nèi)部函數(shù)inner_func的定義和使用與普通函數(shù)基本相同。需要注意的是變量的作用域,在上述代碼中,函數(shù)參數(shù)name對于全局函數(shù)greet是局部變量,對內(nèi)部函數(shù)inner_func來說則是非局部變量。內(nèi)部函數(shù)對于非局部變量的訪問規(guī)則類似于標(biāo)準(zhǔn)的外部函數(shù)訪問全局變量。
從這個(gè)例子我們還可以看到內(nèi)部函數(shù)的一個(gè)作用,就是通過定義內(nèi)部函數(shù)的方式將一些功能隱藏起來,防止外部直接調(diào)用。常見的場景是,在一個(gè)復(fù)雜邏輯的函數(shù)中,將一些小的任務(wù)定義成內(nèi)部函數(shù),然后由這個(gè)外層函數(shù)使用,這樣可以使代碼更為清晰,易于維護(hù)。這些內(nèi)部函數(shù)只會(huì)在這個(gè)外層函數(shù)中使用,不能被其他函數(shù)或模塊使用。
在Python語言中, 函數(shù)也是對象,它可以被創(chuàng)建、賦值給變量,或者作為函數(shù)的返回值。我們來看下面這個(gè)例子。
在上述代碼中,在函數(shù)gen_greet內(nèi)部定義了inner_func函數(shù),并返回了一個(gè)inner_func函數(shù)對象。外部函數(shù)gen_greet返回了一個(gè)函數(shù)對象,所以像gen_greet這樣的函數(shù)也叫工廠函數(shù)。
在內(nèi)部函數(shù)inner_func中,使用了外部函數(shù)的傳參greet_words(非局部變量),以及函數(shù)的參數(shù)name(局部變量),來打印一個(gè)字符串。
接下來,調(diào)用gen_greet("Hello")創(chuàng)建一個(gè)函數(shù)對象say_hello,緊接著調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hello, Mr. Zhang!
同樣的,調(diào)用gen_greet("Hi")創(chuàng)建一個(gè)函數(shù)對象say_hi,調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hi,Tony!
我們可以發(fā)現(xiàn),gen_greet返回的函數(shù)對象具有記憶功能,它能夠把所需使用的非局部變量保存下來,用于后續(xù)被調(diào)用的時(shí)候使用。這種保存了非局部變量的函數(shù)對象被稱作閉包(closure)。
那么閉包是如何實(shí)現(xiàn)的呢?其實(shí)并不復(fù)雜,函數(shù)對象中有一個(gè)屬性__closure__,它就是在創(chuàng)建函數(shù)對象時(shí)用來保存這些非局部變量的。
__closure__屬性是一個(gè)元組或者None類型。在上述代碼中,我們可以通過下面方式查看:
函數(shù)的嵌套所實(shí)現(xiàn)的功能大都可以通過定義類的方式來實(shí)現(xiàn),而且類是更加面向?qū)ο蟮拇a編寫方式。
嵌套函數(shù)的一個(gè)主要用途是實(shí)現(xiàn)函數(shù)的裝飾器。我們看下面的代碼:
在上述代碼中,logger函數(shù)返回函數(shù)with_logging,with_logging則是打印了函數(shù)func的名稱及傳入的參數(shù),然后調(diào)用func, 并將參數(shù)傳遞給func。其中的@wraps(func)語句用于復(fù)制函數(shù)func的名稱、注釋文檔、參數(shù)列表等等,使得with_logging函數(shù)具有被裝飾的函數(shù)func相同的屬性。
代碼中接下來用@logger對函數(shù)power_func進(jìn)行修飾,它的作用等同于下面的代碼:
可見,裝飾器@符其實(shí)就是上述代碼的精簡寫法。
通過了解了嵌套函數(shù)和閉包的工作原理,我們在使用過程中就能夠更加得心應(yīng)手了。
params
就是(5, 5)
(5,) * 2 ,就是2個(gè)5的元組,乘號可以理解成相加。"*" * 30就是30個(gè)“*"的字符串
*params作為參數(shù),前面的*號就是把params元組分解成元素的意思,這樣就分開成為2個(gè)參數(shù)了。實(shí)際上傳遞給了x,y
于是就執(zhí)行了power(5,5)
我怎么就變成大神了【笑哭】
def?A(a):
#這個(gè)下面有個(gè)TAB,就是為了讓下面的語句跟著你定義的這個(gè)A函數(shù)
print('i\'m?A')
#這下面的縮進(jìn)是在A函數(shù)里定義一個(gè)B函數(shù)
def?B(b):
#到這里的縮進(jìn)就是B函數(shù)的范圍了
print('i\'m?b')
print('a+b=',a+b)
#由于不跟著B函數(shù)的縮進(jìn),所以下面的這個(gè)B是A函數(shù)的范圍
B(3)
print('Done!')
A(5)
#樓主才剛學(xué)幾天呀
嵌套函數(shù)在執(zhí)行時(shí)(而不是在定義時(shí))從父范圍中查找變量。
編譯函數(shù)主體,然后驗(yàn)證“自由”變量(未在函數(shù)本身中通過賦值定義),然后將其作為閉包單元綁定到函數(shù),并且代碼使用索引引用每個(gè)單元格。pet_function因此具有一個(gè)自由變量(cage),然后將其通過一個(gè)閉合單元引用,索引為0的閉合本身指向局部變量cage在get_petters功能。
當(dāng)你實(shí)際調(diào)用該函數(shù)時(shí),該閉包將用于在你調(diào)用該函數(shù)時(shí)查看cage周圍作用域中的值。問題就在這里。在你調(diào)用函數(shù)時(shí),該函數(shù)已經(jīng)完成了對其結(jié)果的計(jì)算。將在在執(zhí)行過程中的一些點(diǎn)局部變量分配各的,和字符串,但在功能的結(jié)束,包含了最后一個(gè)值。因此,當(dāng)你調(diào)用每個(gè)動(dòng)態(tài)返回的函數(shù)時(shí),就會(huì)得到打印的值。get_petterscage'cow''dog''cat'cage'cat''cat'
解決方法是不依賴閉包。你可以改用部分函數(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))
無需scoped_cage在循環(huán)中定義函數(shù),編譯僅進(jìn)行一次,而不是在循環(huán)的每次迭代中進(jìn)行。
函數(shù)嵌套。。一般提到這個(gè)有兩個(gè)意思,有的語言運(yùn)行函數(shù)嵌套那就是函數(shù)的嵌套,指在一個(gè)函數(shù)體里定義另一個(gè)函數(shù),比如python
def outer():
name="python"
def inner():
print name
return inner()
有的語言不允許函數(shù)嵌套,那指的就是函數(shù)嵌套調(diào)用。比如c語言的
int a()
{
b();//調(diào)用函數(shù)b
}
遞歸的話就是自己調(diào)用自己
int a(int x){
if(x==5)return 0; //一定要有結(jié)束條件不然遞歸就爆內(nèi)存的
x++;
a(x);
}
調(diào)用函數(shù)
a(0); //那么遞歸過程是a(0)---a(1)---a(2)---a(3)---a(4)---a(5)
當(dāng)前標(biāo)題:python嵌套函數(shù)定義 Python中函數(shù)可以嵌套定義嗎
瀏覽地址:http://www.chinadenli.net/article30/hipiso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營銷、品牌網(wǎng)站建設(shè)、品牌網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)