




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章函數(shù)學(xué)習(xí)目標(biāo)
掌握函數(shù)的定義與調(diào)用方法掌握函數(shù)參數(shù)與返回值掌握變量的作用域掌握lambda表達(dá)式掌握遞歸函數(shù)22025/3/64.1函數(shù)的定義與調(diào)用
Python內(nèi)置了很多實用的函數(shù),可以直接調(diào)用。
求最大值的函數(shù)max,該函數(shù)需要的參數(shù)個數(shù)必須大于等于1個。
>>>max([4,8]) 8 >>>max([1,9,3]) 9 >>>max([5]) 532025/3/64.1函數(shù)的定義與調(diào)用
自定義函數(shù)使用def關(guān)鍵字來標(biāo)明函數(shù)定義的開始。
函數(shù)形參不需要聲明其類型,也不需要指定函數(shù)返回值類型;
即使該函數(shù)不需要接收任何參數(shù),也必須保留一對空的圓括號;
括號后面的冒號必不可少;
函數(shù)體相對于def關(guān)鍵字必須保持一定的空格縮進(jìn)。42025/3/64.1函數(shù)的定義與調(diào)用
使用用戶自定義函數(shù)時,只需通過函數(shù)名加參數(shù)的方式即可獲得結(jié)果。 >>>fib(1000) 112358132134558914423337761098752025/3/6
為函數(shù)的定義加上一段注釋,可以為用戶提供友好的提示和使用幫助。4.2函數(shù)參數(shù)
形參與實參
參數(shù)的默認(rèn)值
關(guān)鍵字參數(shù)
可變參數(shù)與序列解包62025/3/64.2.1形參與實參
聲明函數(shù)時建立的參數(shù)為形式參數(shù),簡稱形參;
調(diào)用函數(shù)時,提供函數(shù)需要的參數(shù)的值,即實際參數(shù),簡稱實參。
實際參數(shù)值默認(rèn)按位置順序依次傳遞給形式參數(shù),如果參數(shù)個數(shù)不對,則會產(chǎn)生錯誤。72025/3/64.2.1形參與實參
在定義函數(shù)時,如果有多個形參,則需要使用逗號進(jìn)行分隔。同時,對于絕大多數(shù)情況,在函數(shù)內(nèi)部直接修改形參的值不會影響實參。 >>>defplus(a,b): print(a) a+=b print(a) >>>a,b=3,2 >>>plus(a,b) 3 5 >>>a,b (3,2)82025/3/64.2.1形參與實參 >>>defmodify(v): #修改列表元素值 v[0]=v[0]+1 >>>a=[2] >>>modify(a) >>>a [3] >>>defappend(v,item): #為列表添加元素 v.append(item) >>>append(a,4) >>>a [3,4] >>>defchange(d): #修改字典元素的值 d['age']=30 >>>b={'name':'Wang','age':20,'sex':'Male’} >>>change(b) >>>b {'name':'Wang','age':30,'sex':'Male'}92025/3/64.2.1形參與實參Python函數(shù)參數(shù)定義時并不指定參數(shù)類型,為減少函數(shù)內(nèi)部數(shù)據(jù)處理時可能發(fā)生的錯誤,讓程序運(yùn)行更加穩(wěn)健。
可以采用isinstance()函數(shù)來顯示判斷參數(shù)的類型,一旦用戶輸入的類型不符合處理要求,進(jìn)入錯誤處理邏輯,這樣編寫的程序會更加嚴(yán)密。
102025/3/6【例4-1】編寫函數(shù)計算圓的面積frommathimportpiasPI defCircleArea(r): ifisinstance(r,int)orisinstance(r,float): returnPI*r*r else: return('Youmustgivemeanintegerorfloatasradius.’) print(CircleArea(3)) 112025/3/64.2.2參數(shù)的默認(rèn)值
在定義函數(shù)時可以為形參設(shè)置默認(rèn)值。
調(diào)用該函數(shù)時,如果只為第一個參數(shù)傳遞實參,則第二個參數(shù)使用默認(rèn)值1。如果為第二個參數(shù)傳遞實參,則使用調(diào)用者顯式傳遞的值。
>>>defsay(message,times=1): print((message+'')*times) >>>say('hello’) hello >>>say('red',3) redredred122025/3/64.2.2參數(shù)的默認(rèn)值
在定義帶有默認(rèn)值參數(shù)的函數(shù)時,默認(rèn)值參數(shù)必須出現(xiàn)在函數(shù)形參列表的最右端,任何一個默認(rèn)值參數(shù)右邊都不能再出現(xiàn)非默認(rèn)值參數(shù)。>>>deff(a=3,b,c=5): #不正確的默認(rèn)參數(shù)值 print(a,b,c) SyntaxError:non-defaultargumentfollowsdefaultargument >>>deff(a=3,b,c): #不正確的默認(rèn)參數(shù)值 print(a,b,c) SyntaxError:non-defaultargumentfollowsdefaultargument >>>deff(a,b,c=5): #正確的默認(rèn)參數(shù)值 print(a,b,c)132025/3/64.2.2參數(shù)的默認(rèn)值
對于列表、字典這樣復(fù)雜類型的參數(shù)默認(rèn)值,可能會導(dǎo)致很嚴(yán)重的邏輯錯誤。142025/3/6>>>defappend(arg,result=[]): result.append(arg) print(result)>>>append('a')['a']>>>append('b')['a','b']>>>append('demo',[1,2,3,4])[1,2,3,4,'demo']>>>append('demo',['a','b'])['a','b','demo']>>>append('a')['a','b','a']>>>append('b')['a','b','a','b']【例4-2】通過None類型取代序列結(jié)構(gòu)的數(shù)據(jù)作為函數(shù)的默認(rèn)值defappend(arg,result=None): ifresultisNone: result=[] result.append(arg) print(result) append('demo',[1,2,3,4]) append('demo',['a','b’]) append('a’) append('b')152025/3/6程序的運(yùn)行結(jié)果如下:[1,2,3,4,'demo']['a','b','demo']['a']['b']【例4-3】求平面上兩點(diǎn)間距離frommathimportsqrt defdist(x1,y1,x2,y2): print("x1={},y1={},x2={},y2={}".format(x1,y1,x2,y2)) print("distanceis{}".format(sqrt((x1-x2)**2+(y1-y2)**2)))
a,b,c,d=1,2,3,4 dist(a,b,c,d) dist(x1=a,x2=c,y1=b,y2=d)162025/3/6程序的運(yùn)行結(jié)果如下:x1=1,y1=2,x2=3,y2=4distanceis2.8284271247461903x1=1,y1=2,x2=3,y2=4distanceis2.82842712474619034.2.4可變參數(shù)與序列解包
函數(shù)參數(shù)書目不確定時,可通過星號*將一組可變數(shù)量的參數(shù)組合成元組,形成可變參數(shù)。
>>>defdemo1(*p): print(p) >>>demo1(1,2,3) (1,2,3) >>>demo1('a','b',1,2) ('a','b',1,2)172025/3/64.2.4可變參數(shù)與序列解包
兩個星號**將可變數(shù)量的參數(shù)組合成字典,形成可變參數(shù)。>>>defdemo2(**p): foriteminp.items(): print(item) >>>demo2(x=1,y=2,z=3) ('x',1) ('y',2) ('z',3)182025/3/6【例4-4】求一組數(shù)字的平均值
求一組數(shù)字的平均值,并且進(jìn)一步將這組數(shù)字按大于平均值和小于平均值分成兩組。defdivideByAverage(*para): avg=sum(para)/len(para) g=[iforiinparaifi>avg] l=[iforiinparaifi<avg] print(avg) print(g) print(l)
divideByAverage(1,2,3,4,5) dist(x1=a,x2=c,y1=b,y2=d)192025/3/6程序的運(yùn)行結(jié)果如下:3.0[4,5][1,2]4.2.4可變參數(shù)與序列解包
>>>defsummary(a,b,c): >>>dic={1:'a',2:'b',3:'c’}print(a+b+c) >>>summary(*dic)>>>lst=[1,2,3] 6>>>summary(*lst) >>>summary(*dic.keys())6 6>>>tup=(1,2,3) >>>summary(*dic.values())>>>summary(*tup) abc6202025/3/64.3函數(shù)返回值
函數(shù)可以沒有返回值。
return語句用來從一個函數(shù)中返回并結(jié)束函數(shù)的執(zhí)行,同時返回一個任意類型的值。
不論return語句出現(xiàn)在函數(shù)的什么位置,一旦得到執(zhí)行將直接結(jié)束函數(shù)的執(zhí)行。
如果函數(shù)沒有return語句或者執(zhí)行了不返回任何值的return語句,即返回空值。212025/3/6【例4-5】統(tǒng)計給定整數(shù)m和n區(qū)間內(nèi)素數(shù)的個數(shù),并輸出這些素數(shù)defisPrime(i): forkinrange(2,i): if(i%k==0): returnFalse returnTrue
m,n=input().split() m,n=int(m),int(n) p=[iforiinrange(m,n+1)ifisPrime(i)] print(len(p)) print(p)222025/3/6程序運(yùn)行如下20404[23,29,31,37]4.3函數(shù)返回值
如果函數(shù)沒有設(shè)置返回值,默認(rèn)返回的是None值,等價于returnNone。>>>defsummary(a,b,c): >>>defsummary(a,b,c): print(a+b+c) print(a+b+c)>>>x=summary(1,2,3) returnNone6 >>>x=summary(1,2,3)>>>print(x) 6None >>>print(x) None232025/3/64.4變量的作用域
局部變量與全局變量
模塊導(dǎo)入變量242025/3/64.4.1局部變量與全部變量
函數(shù)內(nèi)部定義的變量一般為局部變量
不屬于任何函數(shù)的變量一般為全局變量
引用局部變量比全局變量速度快,因此在程序設(shè)計時應(yīng)優(yōu)先考慮使用局部變量。
全局變量可能會增加不同函數(shù)之間的隱式耦合度,因此在實際編程過程中不適宜大量使用。252025/3/64.4.1局部變量與全部變量
局部變量只在該函數(shù)內(nèi)起作用,當(dāng)函數(shù)運(yùn)行結(jié)束后,在該函數(shù)內(nèi)部定義的局部變量被自動刪除而不可訪問。
在函數(shù)內(nèi)部定義的全局變量當(dāng)函數(shù)結(jié)束以后仍然存在并且可以訪問。
如果想要在函數(shù)內(nèi)部修改一個定義在函數(shù)外的變量值,可以通過global來聲明或定義,能夠同時作用于函數(shù)內(nèi)外。262025/3/64.4.1局部變量與全部變量
一個變量已在函數(shù)外定義,如果在函數(shù)內(nèi)需要修改這個變量的值,并將這個賦值結(jié)果反映到函數(shù)之外,可以在函數(shù)內(nèi)用global聲明這個變量為全局變量,明確聲明要使用已定義的同名全局變量。
在函數(shù)內(nèi)部直接使用global關(guān)鍵字將一個變量聲明為全局變量,即使在函數(shù)外沒有定義該全局變量,在調(diào)用這個函數(shù)之后,將自動增加新的全局變量。272025/3/64.4.2模塊導(dǎo)入變量大型的軟件程序往往需要由多個py文件構(gòu)成,其中每個py文件就算作一個模塊。默認(rèn)情況下,.py文件的文件名即為模塊名,可以利用“import模塊名”的方式導(dǎo)入該模塊,也可以通過“import模塊名as模塊別名”的方式為模塊起一個別名。282025/3/6【例4-6】一個簡單的收入計稅程序tax_rate、earning和tax為模塊A(e4_6_A.py)中的三個全局變量,在模塊B(e4_6_B.py)中導(dǎo)入模塊A,并且根據(jù)需要重新確定收入earning,并給出其應(yīng)交稅的金額。tax_rate=0.1 earning=2000 defgetTax(): globalearning earning+=100 returnearning*tax_rate tax=getTax() 292025/3/6e4_6_A.py【例4-6】一個簡單的收入計稅程序importe4_6_AasA print(A.tax) A.earning=3000 tax=A.getTax() print(A.tax) print(tax)
可以看出,原有的稅額為210,當(dāng)前由于收入提升到了3000,稅額調(diào)整為310。302025/3/6運(yùn)行結(jié)果如下:210.0210.0310.0e4_6_B.py4.4.2模塊導(dǎo)入變量Python沒有通常意義上的主函數(shù),在程序中經(jīng)常會放置以下代碼,用以表示主要的代碼執(zhí)行:if__name__=='__main__'。__name__為系統(tǒng)變量,為當(dāng)前模塊的名稱312025/3/6【例4-7】收入計稅程序的修改版本,增加對__name__變量的判斷tax_rate=0.1 earning=2000 print('The__name__is%s'%__name__)
defgetTax(): globalearning earning+=100 returnearning*tax_rate if__name__=='__main__': print('='*30) tax=getTax() print(tax)322025/3/6運(yùn)行結(jié)果為:The__name__is__main__==============================210.0e4_7_A.py4.4.2模塊導(dǎo)入變量importe4_7_AasA if__name__=='__main__': A.earning=3000 tax=A.getTax() print(tax)332025/3/6e4_7_B.py運(yùn)行執(zhí)行結(jié)果The__name__ise4_7_A310.04.5.1lambda表達(dá)式基本用法lambda表達(dá)式只可以包含一個表達(dá)式,不允許包含其他復(fù)雜的語句。
在表達(dá)式中可以調(diào)用其它數(shù),并支持默認(rèn)值參數(shù)和關(guān)鍵參數(shù)。
該表達(dá)式的計算結(jié)果就是函數(shù)的返回值。lambda表達(dá)式的語法格式如下:
lambda[parameter_list]:表達(dá)式342025/3/64.5.1基本用法lambda表達(dá)式必須使用lambda關(guān)鍵字定義。在lambda關(guān)鍵字之后、冒號左邊的是參數(shù)列表,可以沒有參數(shù),也可以有多個參數(shù),由逗號隔開,冒號右邊是該lambda表達(dá)式的返回值。lambda表達(dá)式必須是單行的。lambda表達(dá)式可以直接在程序中使用,也可以將這一表達(dá)式賦值給一個變量。352025/3/64.5.1基本用法
例如add=lambdax,y,z:x+y+z
在使用時,可以直接執(zhí)行add(1,2,3),輸出為6??瓷先ハ喈?dāng)于一個簡單的函數(shù):
defadd(x,y,z): returnx+y+z362025/3/64.5.2對序列結(jié)構(gòu)的處理
lambda表達(dá)式可以沒有輸入?yún)?shù),但必須提供輸出的返回值,即冒號右邊不能為空,若確實需要為空,應(yīng)以None代替。
>>>x=lambda:2+3 >>>print(x()) 5 >>>print(y()) None >>>D={'fl':(lambda:2+3),'f2':(lambda:2*3),'f3':(lambda:2**3)} #無參數(shù)的lambda函數(shù) >>>print(D[‘fl’](),D[‘f2’](),D[‘f3']()) 568372025/3/64.5.3與map()函數(shù)的混合使用map()函數(shù)是Python內(nèi)置的高階函數(shù)。
它接收一個函數(shù)function和一個或多個序列iterable,并通過把fuction依次作用到iterable的每個元素上,得到新的序列并返回。
map()函數(shù)的調(diào)用方法如下: map(function,iterable,...)382025/3/64.5.3與map()函數(shù)的混合使用
在實際使用中,常常把map()函數(shù)與lambda表達(dá)式相結(jié)合使用,實現(xiàn)對序列類型數(shù)據(jù)的靈活方便處理。
>>>deffun(x): returnx+1 >>>a=[1,2,3,4] >>>map(fun,a) <mapobjectat0x0000021B6AC9F240> >>>print(list(map(fun,a))) [2,3,4,5]392025/3/6【例4-8】求數(shù)列
已知一個數(shù)列的通項為f(x)=x3+5x2-2x+1
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字化供應(yīng)鏈優(yōu)化升級合作協(xié)議
- 幼兒園親子故事征文猜猜我有多愛你
- 品牌發(fā)展及合作策略表
- 農(nóng)業(yè)智能裝備技術(shù)應(yīng)用知識試題
- 物業(yè)轉(zhuǎn)讓協(xié)議書錦集
- 農(nóng)業(yè)種植基地生產(chǎn)安全管理協(xié)議
- 數(shù)學(xué)故事書奇妙的世界之旅解讀
- 企業(yè)內(nèi)部管理軟件推廣協(xié)議
- 杜甫詩風(fēng)探究:高中語文深度解析教案
- 三農(nóng)田機(jī)械作業(yè)技術(shù)標(biāo)準(zhǔn)及規(guī)范
- 我的小書桌課件
- 北京大學(xué)- DeepSeek如何提示詞工程和落地場景分析
- 2025年北京社會管理職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫及答案參考
- (完整版)第五章養(yǎng)殖場環(huán)境保護(hù)
- 2025年江蘇省南京市鍋爐壓力容器檢驗研究院招聘20人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 婦女保健知識講座課件
- 南瓜小房子故事課件
- 2024年蘇州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 畢業(yè)設(shè)計(論文)3000t自由鍛液壓機(jī)本體設(shè)計
- 風(fēng)力發(fā)電機(jī)組PLC系統(tǒng)
- Q∕GDW 12131-2021 干擾源用戶接入電網(wǎng)電能質(zhì)量評估技術(shù)規(guī)范
評論
0/150
提交評論