![Python程序設(shè)計基礎(chǔ)項目化教程 課件 項目五 函數(shù)高級應(yīng)用_第1頁](http://file4.renrendoc.com/view11/M02/1C/25/wKhkGWYAALmAA-KbAADYrxiYBzk347.jpg)
![Python程序設(shè)計基礎(chǔ)項目化教程 課件 項目五 函數(shù)高級應(yīng)用_第2頁](http://file4.renrendoc.com/view11/M02/1C/25/wKhkGWYAALmAA-KbAADYrxiYBzk3472.jpg)
![Python程序設(shè)計基礎(chǔ)項目化教程 課件 項目五 函數(shù)高級應(yīng)用_第3頁](http://file4.renrendoc.com/view11/M02/1C/25/wKhkGWYAALmAA-KbAADYrxiYBzk3473.jpg)
![Python程序設(shè)計基礎(chǔ)項目化教程 課件 項目五 函數(shù)高級應(yīng)用_第4頁](http://file4.renrendoc.com/view11/M02/1C/25/wKhkGWYAALmAA-KbAADYrxiYBzk3474.jpg)
![Python程序設(shè)計基礎(chǔ)項目化教程 課件 項目五 函數(shù)高級應(yīng)用_第5頁](http://file4.renrendoc.com/view11/M02/1C/25/wKhkGWYAALmAA-KbAADYrxiYBzk3475.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《Python語言程序設(shè)計》項目五函數(shù)高級應(yīng)用Contents理解變量的作用域掌握函數(shù)的高級應(yīng)用變量的作用域PART01變量的作用域是指變量的作用范圍,即定義一個變量后,在哪些地方可以使用這個變量。按照作用域的不同,Python中的變量可分為局部變量和全局變量。變量的作用域變量的作用域【任務(wù)描述】了解局部變量定義方法和作用了解全局變量定義方法和作用了解global關(guān)鍵字和nonlocal的作用【關(guān)鍵步驟】了解局部變量定義方法和作用了解全局變量定義方法和作用了解global關(guān)鍵字和nonlocal的作用示例011 defLocalVar1(x):#定義函數(shù)LocalVar1,形參x是局部變量2 print('LocalVar1中x的值為:',x)#輸出x3 x=100#將x的值修改為1004 print('LocalVar1中x修改后的值為:',x)#輸出x5 #print('LocalVar1中y的值為:',y)#取消注釋后,該行代碼報錯6 y=20#定義局部變量y,將其賦值為207 print('LocalVar1中y的值為:',y)#輸出y8 defLocalVar2():#定義函數(shù)LocalVar29 x=10#定義局部變量x,將其賦值為1010 print('LocalVar2中調(diào)用LocalVar1前x的值為:',x)#輸出x11 LocalVar1(15)#調(diào)用LocalVar1函數(shù)12 print('LocalVar2中調(diào)用LocalVar1后x的值為:',x)#輸出x13 #print('LocalVar2中y的值為:',y)#取消注釋后,該行代碼報錯14 LocalVar2()#調(diào)用LocalVar2函數(shù)在一個函數(shù)中定義的變量就是局部變量(包括形參),其作用域是從定義局部變量的位置至函數(shù)結(jié)束位置。變量的作用域示例01執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:LocalVar2中調(diào)用LocalVar1前x的值為:10LocalVar1中x的值為:15LocalVar1中x修改后的值為:100LocalVar1中y的值為:20LocalVar2中調(diào)用LocalVar1后x的值為:10在不同的函數(shù)中可以定義相同名字的變量,二者不會沖突,雖然同名但代表不同的變量,所以可以存儲不同的數(shù)據(jù)。局部變量作用域是從定義位置到函數(shù)結(jié)束的位置。變量的作用域示例011 defGlobalVar1():#定義函數(shù)GlobalVar12 print('GlobalVar1中x的值為:',x)#輸出x3 defGlobalVar2():#定義函數(shù)GlobalVar24 x=100#將x賦為1005 print('GlobalVar2中x的值為:',x)#輸出x6 x=20#定義在所有函數(shù)之外,所以x是全局變量,賦為207 GlobalVar1()#調(diào)用GlobalVar1函數(shù)8 GlobalVar2()#調(diào)用GlobalVar2函數(shù)9 GlobalVar1()#調(diào)用GlobalVar1函數(shù)在所有函數(shù)外定義的變量就是全局變量,其在所有函數(shù)中都可以使用。變量的作用域示例01執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:GlobalVar1中x的值為:20GlobalVar2中x的值為:100GlobalVar1中x的值為:20第4行代碼實際上是定義了一個局部變量x并將其賦值為100,而不是修改全局變量x的值。示例011 defGlobalVar1():#定義函數(shù)GlobalVar12 print('GlobalVar1中x的值為:',x)#輸出全局變量x3 defGlobalVar2():#定義函數(shù)GlobalVar24 globalx#通過global關(guān)鍵字聲明在GlobalVar2函數(shù)中使用的是全局變量x5 x=100#將全局變量x賦為1006 print('GlobalVar2中x的值為:',x)#輸出全局變量x7 x=20#定義在所有函數(shù)之外,所以x是全局變量,賦為208 GlobalVar1()#調(diào)用GlobalVar1函數(shù)9 GlobalVar2()#調(diào)用GlobalVar2函數(shù)10 GlobalVar1()#調(diào)用GlobalVar1函數(shù)在一個函數(shù)中使用global關(guān)鍵字,可以聲明在該函數(shù)中使用的是全局變量、而非局部變量。變量的作用域示例01執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:GlobalVar1中x的值為:20GlobalVar2中x的值為:100GlobalVar1中x的值為:100示例011 defouter():#定義函數(shù)outer2 x=10#定義局部變量x并賦為103 definner():#在outer函數(shù)中定義嵌套函數(shù)inner4 x=20#將x賦為205 print('inner函數(shù)中的x值為:',x)6 inner()#在outer函數(shù)中調(diào)用inner函數(shù)7 print('outer函數(shù)中的x值為:',x)8 outer()#調(diào)用outer函數(shù)函數(shù)的定義可以嵌套。通過nonlocal關(guān)鍵字,可以使內(nèi)層的函數(shù)直接使用外層函數(shù)中定義的變量。執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:inner函數(shù)中的x值為:20outer函數(shù)中的x值為:10變量的作用域示例011 defouter():#定義函數(shù)outer2 x=10#定義局部變量x并賦為103 definner():#在outer函數(shù)中定義嵌套函數(shù)inner4 nonlocalx#nonlocal聲明5 x=20#將x賦為206 print('inner函數(shù)中的x值為:',x)7 inner()#在outer函數(shù)中調(diào)用inner函數(shù)8 print('outer函數(shù)中的x值為:',x)9 outer()#調(diào)用outer函數(shù)前面程序改寫:變量的作用域示例01執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:inner函數(shù)中的x值為:20outer函數(shù)中的x值為:20第4行定義了一個新的局部變量x并將其賦為20,而不是將outer函數(shù)中定義的局部變量x修改為20。示例01高級應(yīng)用PART02遞歸函數(shù)是指在一個函數(shù)內(nèi)部通過調(diào)用自己來完成一個問題的求解。分解之后待解決的子問題與原問題有著相同的特性和解法只是在問題規(guī)模上與原問題相比有所減小比如,計算n!的問題可以將其分解為:n!=n*(n-1)!分解后的子問題(n-1)!與原問題n!的計算方法完全一樣,只是規(guī)模有所減小(n-1)!這個子問題又可以進(jìn)一步分解為(n-1)*(n-2)!,(n-2)!可以進(jìn)一步分解為(n-2)*(n-3)!…,直到要計算1!時,直接返回1。遞歸函數(shù)【任務(wù)描述】了解遞歸函數(shù)的含義與用途【關(guān)鍵步驟】了解遞歸函數(shù)的含義與用途遞歸函數(shù)1 deffac(n):#定義函數(shù)fac2 ifn==1:#如果要計算1的階乘,則直接返回1(結(jié)束遞歸調(diào)用的條件)3 return14 returnn*fac(n-1)#將計算n!分解為n*(n-1)!5 print(fac(5))#調(diào)用fac函數(shù)計算5的階乘并將結(jié)果輸出到屏幕編寫遞歸函數(shù)計算n的階乘執(zhí)行程序后,則在屏幕上會輸出:120fac(5)的計算過程如下:fac(5)=>5*fac(4)=>5*(4*fac(3))=>5*(4*(3*fac(2)))=>5*(4*(3*(2*fac(1))))=>5*(4*(3*(2*1)))=>5*(4*(3*2))=>5*(4*6)=>5*24=>120其中,第一行是逐層調(diào)用的過程,第二行是逐層返回的過程。示例021 deffac(n):#定義函數(shù)fac2 f=1#保存階乘結(jié)果3 foriinrange(2,n+1):#i依次取值為2至n4 f*=i#將i乘到f上5 returnf#將計算結(jié)果返回6 print(fac(5))#調(diào)用fac函數(shù)計算5的階乘并將結(jié)果輸出到屏幕一般來說,遞歸函數(shù)可以改為循環(huán)方式實現(xiàn)。遞歸函數(shù)高階函數(shù)與lambda函數(shù)【任務(wù)描述】了解高階函數(shù)的含義與用途了解lambda函數(shù)的含義與用途【關(guān)鍵步驟】了解高階函數(shù)的含義與用途了解lambda函數(shù)的含義與用途示例031 defFunAdd(f,x,y):#定義函數(shù)FunAdd2 returnf(x)+f(y)#用傳給f的函數(shù)先對x和y分別處理后,再求和并返回3 defSquare(x):#定義函數(shù)Square4 returnx**2#返回x的平方5 defCube(x):#定義函數(shù)Cube6 returnx**3#返回x的立方7 print(FunAdd(Square,3,-5))#調(diào)用函數(shù)FunAdd,計算3^2+(-5)^28 print(FunAdd(Cube,3,-5))#調(diào)用函數(shù)FunAdd,計算3^3+(-5)^3高階函數(shù)是指把函數(shù)作為參數(shù)的一種函數(shù)。執(zhí)行程序后,則在屏幕上會輸出:34-98高階函數(shù)與lambda函數(shù)示例03lambda[參數(shù)1[,參數(shù)2,...,參數(shù)n]]:表達(dá)式lambda函數(shù)也稱為匿名函數(shù),是一種不使用def定義函數(shù)的形式,其作用是能快速定義一個簡短的函數(shù)。lambda函數(shù)的定義形式如下所示:冒號后面的表達(dá)式的計算結(jié)果即為該lambda函數(shù)的返回值。1 defFunAdd(f,x,y):#定義函數(shù)FunAdd2 returnf(x)+f(y)#用傳給f的函數(shù)先對x和y分別處理后,再求和并返回3 print(FunAdd(lambdax:x**2,3,-5))#調(diào)用函數(shù)FunAdd,計算32+(-5)24 print(FunAdd(lambdax:x**3,3,-5))#調(diào)用函數(shù)FunAdd,計算33+(-5)3高階函數(shù)與lambda函數(shù)示例03如果內(nèi)層函數(shù)使用了外層函數(shù)中定義的局部變量,并且外層函數(shù)的返回值是內(nèi)層函數(shù)的引用,就構(gòu)成了閉包。定義在外層函數(shù)中但由內(nèi)層函數(shù)使用的變量被稱為自由變量。一般情況下,如果一個函數(shù)結(jié)束,那么該函數(shù)中定義的局部變量就都會釋放。然而,閉包是一種特殊情況,外層函數(shù)在結(jié)束時會發(fā)現(xiàn)其定義的局部變量將來會在內(nèi)層函數(shù)中使用,此時外層函數(shù)就會把這些自由變量綁定到內(nèi)層函數(shù)。因此,所謂閉包,實際上就是將內(nèi)層函數(shù)的代碼以及自由變量(外層函數(shù)定義、但會由內(nèi)層函數(shù)使用)打包在一起。閉包閉包【任務(wù)描述】了解閉包方法和作用【關(guān)鍵步驟】了解閉包方法和作用示例041 defouter(x):#定義函數(shù)outer2 y=10#定義局部變量y并賦為103 definner(z):#在outer函數(shù)中定義嵌套函數(shù)inner4 nonlocalx,y#nonlocal聲明5 returnx+y+z#返回x+y+z的結(jié)果6 returninner#返回嵌套函數(shù)inner的引用7 f=outer(5)#將返回的inner函數(shù)賦給f8 g=outer(50)#將返回的inner函數(shù)賦給g9 print('f(20)的值為:',f(20))10 print('g(20)的值為:',g(20))11 print('f(30)的值為:',f(30))12 print('g(30)的值為:',g(30))閉包示例閉包示例04執(zhí)行程序后,則在屏幕上會輸出:f(20)的值為:35g(20)的值為:80f(30)的值為:45g(30)的值為:90示例04利用裝飾器,可以在不修改已有函數(shù)的情況下向已有函數(shù)中注入代碼,使其具備新的功能。閉包示例041 defdeco1(func):#定義函數(shù)deco12 definner1(*args,**kwargs):#定義函數(shù)inner13 print('deco1begin')4 func(*args,**kwargs)5 print('deco1end')6 returninner1#返回函數(shù)inner1的引用7 defdeco2(func):#定義函數(shù)deco28 definner2(*args,**kwargs):#定義函數(shù)inner29 print('deco2begin')10 func(*args,**kwargs)11 print('deco2end')12 returninner2#返回函數(shù)inner2的引用13 @deco114 deff1(a,b):#定義函數(shù)f115 print('a+b=',a+b)16 @deco117 @deco218 deff2(a,b,c):#定義函數(shù)f219 print('a+b+c=',a+b+c)20 if__name__=='__main__':#當(dāng)腳本文件獨(dú)立執(zhí)行時,則調(diào)用f1函數(shù)和f2函數(shù)21 f1(3,5)#調(diào)用f1函數(shù)22 f2(1,3,5)#調(diào)用f2函數(shù)示例04執(zhí)行程序后,則在屏幕上會輸出如下結(jié)果:deco1begina+b=8deco1enddeco1begindeco2begina+b+c=9deco2enddeco1end裝飾器裝飾器實際上就是前面所學(xué)習(xí)的閉包。在裝飾器外層函數(shù)的形參列表中只有一個形參func,接收要裝飾的函數(shù),在內(nèi)層函數(shù)中直接調(diào)用func即表示執(zhí)行所裝飾的函數(shù)中的代碼。將裝飾器內(nèi)層函數(shù)的形參列表寫為“*args,**kwargs”,表示要裝飾的函數(shù)可以具有任意形式的形參列表;對應(yīng)地,調(diào)用要裝飾的函數(shù)時也要將實參列表寫為“*args,**kwargs”。在要裝飾的函數(shù)前面寫上“@裝飾器名”,即可將裝飾器中的代碼注入到該函數(shù)中。例如,對于第13至15行代碼,會將deco1中的代碼注入到f1函數(shù)中,deco1中的func(*arg,**kwargs)即對應(yīng)f1函數(shù)的調(diào)用。因此,在第21行調(diào)用f1函數(shù)時,會先輸出“deco1begin”,再執(zhí)行f1函數(shù)中的代碼輸出“a+b=8”,最后輸出“deco1end”。一個函數(shù)前面有多個“@裝飾器名”時,按照從后至前的順序依次裝飾。例如,對于第16至19行代碼,先使用deco2裝飾f2函數(shù),即在f2函數(shù)代碼前注入“print('deco2begin')”、在f2函數(shù)代碼后注入“print('deco2end')”;然后再在前面裝飾的基礎(chǔ)上使用deco1裝飾,即在已裝飾代碼前注入“print('deco1begin')”、在已裝飾代碼后注入“print('deco1end')”。f2函數(shù)裝飾后,其實際執(zhí)行的代碼如下所示:print('deco1begin')print('deco2begin')print('a+b+c=',a+b+c)print('deco2end')print('deco1end')裝飾器裝飾器【任務(wù)描述】了解裝飾器方法和作用【關(guān)鍵步驟】了解裝飾器方法和作用示例05如果要注入函數(shù)的形參列表形式固定,則在定義裝飾器時也可以不使用“*args,*kwargs”這種通用形式。裝飾器示例051 defdeco1(func):#定義函數(shù)deco12 definner1(x,y):#定義函數(shù)inner13 print('deco1begin')4 func(x,y)5 print('deco1end')6 returninner1#返回函數(shù)inner1的引用7 defdeco2(func):#定義函數(shù)deco28 def
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人知識產(chǎn)權(quán)授權(quán)合同標(biāo)準(zhǔn)范本
- 人事代理合同樣本:勞務(wù)派遣合同參考模板
- 專業(yè)外包服務(wù)公司員工合同協(xié)議
- 上海市標(biāo)準(zhǔn)勞動合同參考合同
- 中藥材種植與收購合同
- 個人林地承包經(jīng)營合同
- 鄉(xiāng)村房產(chǎn)交易合同范本
- 租賃轉(zhuǎn)讓合同范本
- 臨時勞動合同模板及協(xié)議書
- 個人股權(quán)轉(zhuǎn)讓合同條款示例
- 2023年12月廣東珠海市軌道交通局公開招聘工作人員1人筆試近6年高頻考題難、易錯點(diǎn)薈萃答案帶詳解附后
- 腹腔鏡腎上腺腫瘤切除術(shù)查房護(hù)理課件
- 燃?xì)庹质綘t應(yīng)急預(yù)案
- 藥劑科合理用藥課件
- 專題23平拋運(yùn)動臨界問題相遇問題類平拋運(yùn)和斜拋運(yùn)動
- 超聲科醫(yī)德醫(yī)風(fēng)制度內(nèi)容
- 高三開學(xué)收心班會課件
- 蒸汽換算計算表
- 四年級計算題大全(列豎式計算,可打印)
- 科技計劃項目申報培訓(xùn)
- 591食堂不合格食品處置制度
評論
0/150
提交評論