版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章
函數(shù)和模塊《Python數(shù)據(jù)分析與應(yīng)用》①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提高程序設(shè)計(jì)和調(diào)試的效率。使用函數(shù)的好處1概述
函數(shù)是一組實(shí)現(xiàn)某一特定功能的語句集合,是可以重復(fù)調(diào)用、功能相對(duì)獨(dú)立完整的程序段。函數(shù)的定義與調(diào)用定義一般形式:def
函數(shù)名([形式參數(shù)表]):函數(shù)體
[return表達(dá)式]采用def關(guān)鍵字定義函數(shù),不需要指定返回值的類型;函數(shù)的參數(shù)不限,不需要指定參數(shù)類型;參數(shù)括號(hào)后面的冒號(hào)“:”必不可少;函數(shù)體相對(duì)于def關(guān)鍵字必須保持一定的空格縮進(jìn);return語句是可選的;允許定義函數(shù)體為空的函數(shù)。函數(shù)定義時(shí)要注意一般形式:函數(shù)名([實(shí)際參數(shù)表])函數(shù)的調(diào)用說明實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,但在進(jìn)行函數(shù)調(diào)用時(shí)必須有確定的值。函數(shù)的實(shí)參和形參應(yīng)在個(gè)數(shù)、類型和順序上一一對(duì)應(yīng)。對(duì)于無參函數(shù),調(diào)用時(shí)實(shí)參表列為空,但()不能省。例:編寫函數(shù),求3個(gè)數(shù)中的最大值。defgetMax(a,b,c):ifa>b:max=aelse:max=bif(c>max):max=creturnmaxa,b,c=eval(input("inputa,b,c:"))n=getMax(a,b,c)print("max=",n)在Python中不允許前向引用,即在函數(shù)定義之前,不允許調(diào)用該函數(shù)。函數(shù)的參數(shù)和函數(shù)的返回值形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中對(duì)應(yīng)的參數(shù)說明實(shí)參可以是常量、變量和表達(dá)式,但必須在函數(shù)調(diào)用之間有確定的值。形參與實(shí)參個(gè)數(shù)相同形參定義時(shí)編譯系統(tǒng)并不為其分配存儲(chǔ)空間,也無初值;只有在函數(shù)調(diào)用時(shí),臨時(shí)分配存儲(chǔ)空間,接受來自實(shí)參的值;函數(shù)調(diào)用結(jié)束,內(nèi)存空間釋放。參數(shù)傳遞方式單向的值傳遞實(shí)參和形參之間是單向的值傳遞。在函數(shù)調(diào)用時(shí),將各實(shí)參表達(dá)式的值計(jì)算出來,賦給形參變量。因此,實(shí)參與形參必須類型相同或賦值兼容,個(gè)數(shù)相等,一一對(duì)應(yīng)。在函數(shù)調(diào)用中,即使實(shí)參為變量,形參值的改變也不會(huì)改變實(shí)參變量的值。實(shí)參和形參占用不同的內(nèi)存單元傳地址方式
函數(shù)調(diào)用時(shí),將實(shí)參數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參defswap(a,b):a,b=b,aprint("a=",a,"b=",b)x,y=eval(input("inputx,y:"))swap(x,y)print("x=",x,"y=",y)運(yùn)行結(jié)果:inputx,y:3,5a=5b=3x=3y=5形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)例如:編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞defswap(a_list):a_list[0],a_list[1]=a_list[1],a_list[0]print("a_list[0]=",a_list[0],"a_list[1]=",a_list[1])x_list=[3,5]swap(x_list)print("x_list[0]=",x_list[0],"x_list[1]=",x_list[1])運(yùn)行結(jié)果:a_list[0]=5a_list[1]=3x_list[0]=5x_list[1]=3例:傳地址方式。函數(shù)的返回值
指函數(shù)被調(diào)用、執(zhí)行完后,返回給主調(diào)函數(shù)的值。函數(shù)的返回語句一般形式
return表達(dá)式功能:
使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù)defadd(a,b):c=a+b
x=add(3,20)print(x)說明
函數(shù)內(nèi)可有多條返回語句。如果沒有return語句,會(huì)自動(dòng)返回NONE;如果有return語句,但是return后面沒有表達(dá)式也返回NONE。例:編寫函數(shù),判斷一個(gè)數(shù)是否是素?cái)?shù)。defisprime(n):foriinrange(2,n):if(n%i==0):return0return1m=int(input("請(qǐng)輸入一個(gè)整數(shù):"))flag=isprime(m)if(flag==1):print("%d是素?cái)?shù)"%m)else:print("%d不是素?cái)?shù)"%m)參數(shù)分類必備參數(shù)默認(rèn)參數(shù)關(guān)鍵參數(shù)不定長(zhǎng)參數(shù)必備參數(shù)必備參數(shù)是指調(diào)用函數(shù)時(shí),參數(shù)的個(gè)數(shù),參數(shù)的數(shù)據(jù)類型,以及參數(shù)的輸入順序必須正確,否則會(huì)出現(xiàn)語法錯(cuò)誤。>>>defprintme(str):
print(str)
return>>>printme()Traceback(mostrecentcalllast):File"<pyshell#40>",line1,in<module>printme()TypeError:printme()missing1requiredpositionalargument:'str'默認(rèn)參數(shù)
默認(rèn)參數(shù)是指允許函數(shù)參數(shù)有缺省值,如果調(diào)用函數(shù)時(shí)不給參數(shù)傳值,參數(shù)將獲得缺省值。Python通過在函數(shù)定義的形參名后加上賦值運(yùn)算符(=)和默認(rèn)值,給形參指定默認(rèn)參數(shù)值。注意:默認(rèn)參數(shù)值是一個(gè)不可變的參數(shù)。defsay(message,times=1):
printmessage*times
#調(diào)用函數(shù)
say('Hello')#默認(rèn)參數(shù)times為1
say('World',5)【程序運(yùn)行如下所示】HelloWorldWorldWorldWorldWorld關(guān)鍵參數(shù)
函數(shù)的多個(gè)參數(shù)值一般默認(rèn)從左到右依次傳入。Python也可以通過關(guān)鍵參數(shù)用于改變賦值順序,關(guān)鍵參數(shù)又稱命名參數(shù)。deffunc(a,b=5,c=10): print('ais',a,'andbis',b,'andcis',c)#調(diào)用函數(shù)func(3,5)func(25,c=24)func(c=50,a=100)【程序運(yùn)行如下所示】ais3andbis5andcis10ais25andbis5andcis24ais100andbis5andcis50不定長(zhǎng)參數(shù)
不定長(zhǎng)參數(shù)又稱可變長(zhǎng)參數(shù),若參數(shù)以一個(gè)*號(hào)開頭的代表著一個(gè)任意長(zhǎng)度的元組,可以接收連續(xù)一串參數(shù)。參數(shù)以兩個(gè)*號(hào)開頭的代表著一個(gè)字典,參數(shù)的形式是“key=value”,接受連續(xù)任意多個(gè)參數(shù)。deffoo(x,*y,**z): print(x) print(y) print(z)輸入foo(1)輸入foo(1,2,3,4)輸入foo(1,2,3,a="a",b="b")匿名函數(shù)匿名函數(shù)是指不使用def語句定義一個(gè)函數(shù)。python使用lambda來創(chuàng)建匿名函數(shù)。lambda只是一個(gè)表達(dá)式,而不是一個(gè)代碼塊,比def簡(jiǎn)單很多。lambda函數(shù)的形式如下: lambda[arg1[,arg2,.....argn]]:expression【例】lambda函數(shù)舉例sum=lambdaarg1,arg2:arg1+arg2;#調(diào)用sum函數(shù)print("相加后的值為:",sum(10,20))【程序運(yùn)行如下所示】相加后的值為:30函數(shù)的遞歸調(diào)用
在函數(shù)的執(zhí)行過程中又直接或間接調(diào)用該函數(shù)本身
直接遞歸調(diào)用
在函數(shù)中直接調(diào)用函數(shù)本身間接遞歸調(diào)用
在函數(shù)中調(diào)用其它函數(shù),其它函數(shù)又調(diào)用原函數(shù)f()調(diào)f調(diào)f2調(diào)f1f1()f2()defa(x):……
z=b(y)…….return(2*z)defb(t):……
m=a(x)…….return(3+c)deff(x):……
z=f(y)…….return(2*z)遞歸算法的兩個(gè)基本特征遞推歸納將問題轉(zhuǎn)化為比原問題小的同類規(guī)模,歸納出一般遞推公式.
故所處理的對(duì)象要有規(guī)律地遞增或遞減遞歸終止當(dāng)規(guī)模小到一定的程度應(yīng)該結(jié)束遞歸調(diào)用,逐層返回常用條件語句來控制何時(shí)結(jié)束遞歸13十二月2024例求遞歸方法求n的階乘遞推歸納:遞歸終止:deffac(n):ifn==0:f=1else:f=fac(n-1)*n;returnfn=int(input("pleaseinputn:"))f=fac(n)print("%d!=%d"%(n,f))總結(jié)執(zhí)行過程(兩個(gè)階段)第一階段:逐層調(diào)用,調(diào)用函數(shù)自身第二階段:逐層返回,返回到調(diào)用該層的位置遞歸調(diào)用是多重嵌套調(diào)用的一種特殊情況調(diào)用的深度:調(diào)用的層數(shù)
前提:原問題可以層層分解為類似的子問題,且子問題比原問題規(guī)模更小規(guī)模最小的問題具有直接解方法:尋找分解方法:將原問題轉(zhuǎn)化為子問題求解,例:n!=n*(n-1)!設(shè)計(jì)遞歸出口:根據(jù)規(guī)模最小的子問題確定遞歸終止條件,例:求解n!,當(dāng)n=0時(shí),n!=1;設(shè)計(jì)遞歸算法的方法13十二月2024例:漢諾塔問題。設(shè)有三座塔座(A、B、C),在一個(gè)塔座(設(shè)為A)上有64個(gè)盤片,盤片不等,按大盤在下,小盤在上的順序依次疊放?,F(xiàn)要將A塔上的盤片借助于B塔,移到C塔上并保持同樣順序疊排,移動(dòng)盤片時(shí)必須遵守以下規(guī)則:(1)每次只能移動(dòng)一個(gè)圓盤;(2)圓盤可以插在A、B、C任意一個(gè)塔座上;(3)任何時(shí)候都不能將一個(gè)較大的圓盤放到較小的圓盤之上。13十二月2024
將A塔上的紅、黃兩盤移動(dòng)到B上藍(lán)盤放到C上將紅、黃兩盤從B移動(dòng)到C盤上。(完成)ABC問題分析:(1)n=1時(shí),直接將其從A->C;(2)n>1時(shí),只要先將前n-1個(gè)借助C從A->B,那么可以把第n個(gè)直接從A->C;(3)如何將剩下的n-1個(gè)圓盤遵守規(guī)則借助A從B->C,問題性質(zhì)同(2);問題性質(zhì)相同,因此適合采用遞歸過程!若將n個(gè)盤片按規(guī)定從A塔移至C塔,移動(dòng)步驟可分為三步:把A塔上的n-1個(gè)盤片借助C移動(dòng)到B塔把第n個(gè)盤片從A塔移至C塔把B塔上的n-1個(gè)盤片借助A塔移至C塔算法用函數(shù)hanoi(n,x,y,z)以遞歸算法實(shí)現(xiàn)13十二月2024盤片數(shù)源塔借用塔目標(biāo)塔
遞歸終止:當(dāng)遞歸調(diào)用到盤片數(shù)為1時(shí)算法描述:1)遞歸調(diào)用hanoi(n-1,a,c,b)2)將n號(hào)盤片從a塔移動(dòng)到c塔3)遞歸調(diào)用hanoi(n-1,b,a,c)count=0defhanoi(n,x,y,z):globalcountifn==1:count+=1move(count,x,z)else:hanoi(n-1,x,z,y);
count+=1move(count,x,z)hanoi(n-1,y,x,z);
defmove(n,x,y):print("step%d:Movediskform%cto%c"%(count,x,y))m=int(input("Inputthenumberofdisks:"))print("Thestepstomoving%
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 交通標(biāo)線涂料采購(gòu)合同范例
- 租賃車輛運(yùn)營(yíng)合同范例
- 大米訂單合同范例
- 特殊經(jīng)營(yíng)合同范例
- 網(wǎng)絡(luò)活動(dòng)策劃合同范例
- 建筑幕墻檢測(cè)合同范例
- 供應(yīng)鏈倉(cāng)儲(chǔ)租賃合同范例
- 私廚合作合同范例
- 回收餐飲油脂合同范例
- 便利店出租合同范例
- 高考語文新題型+“文學(xué)短評(píng)”相關(guān)寫作(真題+技法+練習(xí))
- 汽車認(rèn)識(shí)實(shí)訓(xùn)課件
- 輪機(jī)工程材料18章總結(jié)
- 公路管理行業(yè)支撐性科研課題立項(xiàng)評(píng)審評(píng)分標(biāo)準(zhǔn)表
- 單招面試技巧范文
- GB/T 5195.1-2006螢石氟化鈣含量的測(cè)定
- (職高)高一語文期末測(cè)試題及答案解析
- 2023年自考傳播學(xué)概論試題及答案
- 2023年青馬工程培訓(xùn)班結(jié)業(yè)考試題庫(kù)
- 紅色簡(jiǎn)約大氣年會(huì)晚會(huì)節(jié)目單
- 2023年住院醫(yī)師規(guī)范化培訓(xùn)胸外科出科考試
評(píng)論
0/150
提交評(píng)論