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

創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)開(kāi)發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開(kāi)發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。
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是類(class)的話才有這種寫法。
希望對(duì)你有所幫助~~
一、函數(shù)的定義
函數(shù)是指將一組語(yǔ)句的集合通過(guò)一個(gè)名字(函數(shù)名)封裝起來(lái),想要執(zhí)行這個(gè)函數(shù),只需要調(diào)用函數(shù)名即可
特性:
減少重復(fù)代碼
使程序變得可擴(kuò)展
使程序變得易維護(hù)
二、函數(shù)的參數(shù)
2.1、形參和實(shí)參數(shù)
形參,調(diào)用時(shí)才會(huì)存在的值
實(shí)慘,實(shí)際存在的值
2.2、默認(rèn)參數(shù)
定義:當(dāng)不輸入?yún)?shù)值會(huì)有一個(gè)默認(rèn)的值,默認(rèn)參數(shù)要放到最后
2.3、 關(guān)鍵參數(shù)
定義: 正常情況下,給函數(shù)傳參數(shù)要安裝順序,不想按順序可以用關(guān)鍵參數(shù),只需要指定參數(shù)名即可,(指定了參數(shù)名的就叫關(guān)鍵參數(shù)),但是要求是關(guān)鍵參數(shù)必須放在位置參數(shù)(以位置順序確定對(duì)應(yīng)的參數(shù))之后
2.4、非固定參數(shù)
定義: 如你的函數(shù)在傳入?yún)?shù)時(shí)不確定需要傳入多少個(gè)參數(shù),就可以使用非固定參數(shù)
# 通過(guò)元組形式傳遞
# 通過(guò)列表形式傳遞
# 字典形式(通過(guò)k,value的方式傳遞)
# 通過(guò)變量的方式傳遞
三、函數(shù)的返回值
作用:
返回函數(shù)執(zhí)行結(jié)果,如果沒(méi)有設(shè)置,默認(rèn)返回None
終止函數(shù)運(yùn)行,函數(shù)遇到return終止函數(shù)
四、變量的作用域
全局變量和局部變量
在函數(shù)中定義的變量叫局部變量,在程序中一開(kāi)始定義的變量叫全局變量
全局變量作用域整個(gè)程序,局部變量作用域是定義該變量的函數(shù)
當(dāng)全局變量與局部變量同名是,在定義局部變量的函數(shù)內(nèi),局部變量起作用,其他地方全局變量起作用
同級(jí)的局部變量不能互相調(diào)用
想要函數(shù)里邊的變量設(shè)置成全局變量,可用global進(jìn)行設(shè)置
五、特殊函數(shù)
5.1、嵌套函數(shù)
定義: 嵌套函數(shù)顧名思義就是在函數(shù)里邊再嵌套一層函數(shù)
提示 在嵌套函數(shù)里邊調(diào)用變量是從里往外依次調(diào)用,意思就是如果需要調(diào)用的變量在當(dāng)前層沒(méi)有就會(huì)去外層去調(diào)用,依次內(nèi)推
匿名函數(shù)
基于Lambda定義的函數(shù)格式為: lambda 參數(shù):函數(shù)體
參數(shù),支持任意參數(shù)。
匿名函數(shù)適用于簡(jiǎn)單的業(yè)務(wù)處理,可以快速并簡(jiǎn)單的創(chuàng)建函數(shù)。
# 與三元運(yùn)算結(jié)合
5.3、高階函數(shù)
定義:變量可以指向函數(shù),函數(shù)的參數(shù)可以接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)稱之為高階函數(shù) 只需要滿足一下任意一個(gè)條件,即是高階函數(shù)
接收一個(gè)或多個(gè)函數(shù)作為輸入
return返回另一個(gè)函數(shù)
5.4、遞歸函數(shù)
定義:一個(gè)函數(shù)可以調(diào)用其他函數(shù),如果一個(gè)函數(shù)調(diào)用自己本身,這個(gè)函數(shù)就稱為遞歸函數(shù)
在默認(rèn)情況下Python最多能遞歸1000次,(這樣設(shè)計(jì)師是為了防止被內(nèi)存被撐死)可以通過(guò)sys.setrecursionlimit(1500)進(jìn)行修改
遞歸實(shí)現(xiàn)過(guò)程是先一層一層的進(jìn),然后在一層一層的出來(lái)
必須有一個(gè)明確的條件結(jié)束,要不然就是一個(gè)死循環(huán)了
每次進(jìn)入更深層次,問(wèn)題規(guī)模都應(yīng)該有所減少
遞歸執(zhí)行效率不高,遞歸層次過(guò)多會(huì)導(dǎo)致站溢出
# 計(jì)算4的階乘 4x3x2x1
# 打印數(shù)字從1-100
5.5、閉包現(xiàn)象
定義:內(nèi)層函數(shù)調(diào)用外層函數(shù)的變量,并且內(nèi)存函數(shù)被返回到外邊去了
閉包的意義:返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得,該函數(shù)無(wú)論在何處調(diào)用,優(yōu)先使用自己外層包裹的作用域
我怎么就變成大神了【笑哭】
def?A(a):
#這個(gè)下面有個(gè)TAB,就是為了讓下面的語(yǔ)句跟著你定義的這個(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(niǎo)函數(shù)的縮進(jìn),所以下面的這個(gè)B是A函數(shù)的范圍
B(3)
print('Done!')
A(5)
#樓主才剛學(xué)幾天呀
在前面已經(jīng)多次提到函數(shù)這個(gè)概念,之所以沒(méi)有解釋什么是函數(shù),是因?yàn)槌绦蛑械暮瘮?shù)和數(shù)學(xué)中的函數(shù)差不多,如input()、range()等都是函數(shù),這些都是Python的標(biāo)準(zhǔn)函數(shù),直接使用就可以了。根據(jù)需要,用戶也可以自定義函數(shù)。
12.1 函數(shù)
函數(shù)的結(jié)構(gòu):
def 函數(shù)名(參數(shù)):
函數(shù)體
return 返回值
例如:數(shù)學(xué)中的函數(shù)f(x)=2x+5在Python中可以定義如下:
def f(x):
y=2*x+5
return(y)
如果x取值為3,可以使用如下語(yǔ)句調(diào)用函數(shù):
f(3)
下面給出完整的程序代碼:
def f(x):
y=2*x+5
return(y)
res=f(3)
print(res)
運(yùn)行結(jié)果:11
如上例中的x是函數(shù)f(x)的參數(shù),有時(shí)也被稱為形式參數(shù)(簡(jiǎn)稱形參),在函數(shù)被調(diào)用時(shí),x被具體的值3替換y就是函數(shù)的返回值,這個(gè)值3也被稱為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)。
上例中的y是函數(shù)f(x)的返回值。并不是所有的函數(shù)都有參數(shù)和返回值。如下面的函數(shù):
def func():
print('此為無(wú)參數(shù)傳遞、無(wú)返回值的函數(shù)')
func()
輸出結(jié)果:此為無(wú)參數(shù)傳遞、無(wú)返回值的函數(shù)
可以看出,該函數(shù)func()無(wú)參數(shù),故調(diào)用時(shí)不用賦給參數(shù)值。
函數(shù)也可以有多個(gè)參數(shù),如f(x,y)=x2+y2,可用Python語(yǔ)言定義如下:
def f(x,y):
z=x**2+y**2
return z
print(f(2,3)) #調(diào)用函數(shù)f(x,y)
輸出結(jié)果:13
也可以通過(guò)直接給參數(shù)列表中的參數(shù)賦值的方法,為參數(shù)添加默認(rèn)值,如果用戶賦予參數(shù)值,則按照用戶賦值執(zhí)行,否則使用默認(rèn)值。例如:
def f(x,y=3):
z=x**2+y**2
return z
若調(diào)用時(shí)參數(shù)列表為(2,1),即x賦值為2,y賦值為1:
print(f(2,1))
輸出結(jié)果為:5
若調(diào)用時(shí)參數(shù)列表為(2),即x賦值為2,y賦值省缺,則y使用默認(rèn)值:
print(f(2))
輸出結(jié)果為:13
回調(diào)函數(shù),又稱函數(shù)回調(diào),是將函數(shù)作為另一函數(shù)的參數(shù)。
例如:
def func(fun,m,n):
fun(m,n)
def f_add(m,n):
print('m+n=',m+n)
def f_mult(m,n):
print('m*n=',m*n)
func(f_add,2,3)
func(f_mult,2,3)
輸出結(jié)果:
m+n= 5
m*n= 6
在f_add(m,n)和f_mult(m,n)被定義前,func(fun,m,n)中的fun(m,n)就已經(jīng)調(diào)用了這兩個(gè)函數(shù),即“先調(diào)用后定義”,這也是回調(diào)函數(shù)的特點(diǎn)。
如果無(wú)法預(yù)知參數(shù)的個(gè)數(shù),可以在參數(shù)前面加上*號(hào),這種參數(shù)實(shí)際上對(duì)應(yīng)元組類型。譬如,參會(huì)的人數(shù)事先不能確定,只能根據(jù)與會(huì)人員名單輸入:
def func(*names):
print('今天與會(huì)人員有:')
for name in names:
print(name)
func('張小兵','陳曉梅','李大海','王長(zhǎng)江')
運(yùn)行后,輸出結(jié)果為:
今天與會(huì)人員有:
張小兵
陳曉梅
李大海
王長(zhǎng)江
參數(shù)為字典類型,需要在參數(shù)前面加上**號(hào)。
def func(**kwargs):
for i in kwargs:
print(i,kwargs[i])
func(a='a1',b='b1',c='c1')
輸出結(jié)果為:
a a1
b b1
c c1
一個(gè)有趣的實(shí)例:
def func(x,y,z,*args,**kwargs):
print(x,y,z)
print(args)
print(kwargs)
func('a','b','c','Python','is easy',py='python',j='java',ph='php')
輸出結(jié)果:
a b c # 前三個(gè)實(shí)參賦給前三個(gè)形參
('Python', 'is easy') # *args接收元組數(shù)據(jù)
{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典數(shù)據(jù)
12.2 變量的作用域
變量的作用域即變量的有效范圍,可分為全局變量和局部變量。
局部變量
在函數(shù)中定義的變量就是局部變量,局部變量的作用域僅限于函數(shù)內(nèi)部使用。
全局變量
在主程序中定義的變量就是全局變量,但在函數(shù)中用關(guān)鍵字global修飾的變量也可以當(dāng)做全局變量來(lái)使用。
全局變量的作用域是整個(gè)程序,也就是說(shuō),全局變量可以在整個(gè)程序中可以訪問(wèn)。
下面通過(guò)實(shí)例去討論:
程序1:
a=1 # a為全局變量
def a_add():
print('a的初值:',a) # 在函數(shù)中讀取a的值
a_add() # 調(diào)用函數(shù)a_add()
a+=1 # 主程序語(yǔ)句,a增加1
print('a現(xiàn)在的值是:',a) # 主程序語(yǔ)句,讀取a的值
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
這個(gè)結(jié)果和我們想象的一樣,全局變量a既可以在主程序中讀取,也可以在子程序(函數(shù))中讀取。
程序2:
a=1
def a_add():
a+=1
print('a的初值:',a)
a_add()
print('a現(xiàn)在的值是:',a)
運(yùn)行程序1時(shí)出現(xiàn)如下錯(cuò)誤提示:
UnboundLocalError: local variable 'a' referenced before assignment
意思是:局部變量'a'在賦值之前被引用。
從語(yǔ)法上來(lái)講,該程序沒(méi)有錯(cuò)誤。首先定義了一個(gè)全局變量a并賦值為1,又定義了一個(gè)函數(shù)a_add(),函數(shù)內(nèi)的語(yǔ)句a+=1就是出錯(cuò)的根源,雖然我們的初衷是想讓全局變量a的值增加1,但從錯(cuò)誤提示看,這個(gè)語(yǔ)句中的a并不是全局變量,而是局部變量。看來(lái),在函數(shù)中讀取全局變量的值是沒(méi)有問(wèn)題的(在程序1中已經(jīng)得到了驗(yàn)證),但要在函數(shù)中改變?nèi)肿兞康闹凳遣恍械模ㄔ诔绦?的錯(cuò)誤提示a+=1中的a 是局部變量,而非全局變量)。
怎樣解決這個(gè)問(wèn)題?
程序3:
a=1
def a_add(x):
x+=1
return x
print('a的初值:',a)
a=a_add(a)
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
結(jié)果的確是正確的,但在函數(shù)a_add(x)中沒(méi)有調(diào)用變量a(沒(méi)有出現(xiàn)變量a)。
程序4:
a=1
def a_add(a):
a+=1
return a
print('a的初值:',a)
a=a_add(a)
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
對(duì)比程序4和程序3不難發(fā)現(xiàn),其實(shí)程序4只是簡(jiǎn)單的把函數(shù)的參數(shù)x變成了a,這個(gè)a的實(shí)質(zhì)和程序3中的x還是一樣的。這進(jìn)一步證實(shí),函數(shù)中的a是局部變量,與主程序的全局變量a有著本質(zhì)的區(qū)別。
程序5:
a=1
def a_add():
global a
a+=1
print('a的初值:',a)
a_add()
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
程序5和程序2相比較,僅僅是在函數(shù)中添加了一個(gè)定義“global a”,此時(shí)的局部變量a就可以當(dāng)做全局變量使用,由于它和全局變量a同名,自然也就不用區(qū)分a究竟是全局變量還是局部變量了,在主程序和該函數(shù)內(nèi)都可以訪問(wèn)、修改變量a的值了。
雖然使用global可使變量使用起來(lái)非常方便,但也容易引起混淆,故在使用過(guò)程中還是謹(jǐn)慎為好。
12.3 函數(shù)的遞歸與嵌套
遞歸,就是函數(shù)調(diào)用它自身。遞歸必須設(shè)置停止條件,否則函數(shù)將無(wú)法終止,形成死循環(huán)。
以計(jì)算階乘為例:
def func(n):
if n==1:
return 1
else:
return n*func(n-1) #func( )調(diào)用func( )
print(func(5))
運(yùn)行結(jié)果為:120
嵌套,指在函數(shù)中調(diào)用另外的函數(shù)。這是程序中常見(jiàn)的一種結(jié)構(gòu),在此不再贅述。
匿名函數(shù)
Python中可以在參數(shù)前加上關(guān)鍵字lambda定義一個(gè)匿名函數(shù),這樣的函數(shù)一般都屬于“一次性”的。
例如:
程序1:這是一個(gè)常規(guī)的函數(shù)定義和調(diào)用。
def f_add(x,y):
return x+y
print(f_add(2,3))
輸出結(jié)果:5
程序2:使用lambda定義匿名函數(shù)。
f_add=lambda x,y:x+y
print(f_add(2,3))
輸出結(jié)果:5
從上面的代碼可以看出,使用lambda僅僅減少了一行代碼。f_add=lambda x,y:x+y中的f_add不是變量名,而是函數(shù)名。程序1和程序2的print( )語(yǔ)句中的參數(shù)都是一樣的——調(diào)用函數(shù)f_add( )。所以,匿名函數(shù)并沒(méi)有太多的優(yōu)點(diǎn)。
嵌套函數(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周圍作用域中的值。問(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'
解決方法是不依賴閉包。你可以改用部分函數(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內(nèi)層函數(shù)不受外部變化影響,只能內(nèi)層調(diào)用,外層無(wú)法訪問(wèn),python嵌套循環(huán)內(nèi)外層間是不會(huì)影響的。Python是一個(gè)高層次的結(jié)合了解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言,Python的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語(yǔ)言經(jīng)常使用英文關(guān)鍵字,其他語(yǔ)言的一些標(biāo)點(diǎn)符號(hào),它具有比其他語(yǔ)言更有特色語(yǔ)法結(jié)構(gòu)。
本文名稱:python函數(shù)的嵌套,python函數(shù)里面嵌套定義函數(shù)
鏈接分享:http://chinadenli.net/article36/dsgihpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、App開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、服務(wù)器托管、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)