版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1云南財(cái)經(jīng)大學(xué)信息學(xué)院
Python數(shù)據(jù)分析及應(yīng)用第四章函數(shù)目錄
4.1函數(shù)的定義與調(diào)用4.1.1函數(shù)的定義
4.1.2函數(shù)的調(diào)用
4.2參數(shù)與返回值4.2.1默認(rèn)參數(shù)4.2.2關(guān)鍵字參數(shù)4.2.3可變長(zhǎng)參數(shù)4.2.4返回值4.3變量的作用域4.3.1局部變量4.3.2全局變量4.4遞歸(1)知識(shí)目標(biāo):掌握函數(shù)的定義及調(diào)用,掌握定義函數(shù)時(shí),如何設(shè)置參數(shù)和返回值,掌握局部變量和全局變量的使用,學(xué)會(huì)應(yīng)用遞歸函數(shù)來(lái)解決問(wèn)題。
(2)技能目標(biāo):函數(shù)是編程中非常重要的組成部分,學(xué)會(huì)應(yīng)用函數(shù)實(shí)現(xiàn)特定功能、提高代碼復(fù)用率、增強(qiáng)程序的可讀性和可維護(hù)性。
(3)素質(zhì)目標(biāo):?通過(guò)學(xué)習(xí)函數(shù)的定義與使用,掌握如何使用Python解決實(shí)際問(wèn)題,?同時(shí)培養(yǎng)邏輯思維和編程能力,?為未來(lái)的學(xué)習(xí)和職業(yè)發(fā)展奠定堅(jiān)實(shí)基礎(chǔ)。3學(xué)習(xí)目標(biāo)
函數(shù)的概念最早起源于數(shù)學(xué)領(lǐng)域,用于描述數(shù)學(xué)關(guān)系中的輸入與輸出。隨著計(jì)算機(jī)科學(xué)的發(fā)展,函數(shù)的概念也被引入到了計(jì)算機(jī)編程中。編程函數(shù)用于將一組相關(guān)的指令封裝在一起,形成一個(gè)可以重復(fù)使用的代碼塊。通過(guò)函數(shù),程序員可以更高效地編寫和維護(hù)代碼,從而提高代碼的可讀性和可維護(hù)性。在Python中,使用函數(shù)可以加強(qiáng)代碼的復(fù)用性、減少代碼冗余,從而提高程序編寫的效率。
本章主要介紹了函數(shù)的概念、函數(shù)的分類及定義、函數(shù)的調(diào)用、返回值、函數(shù)的參數(shù)、變量的作用域及函數(shù)遞歸的使用方法等。
4本章導(dǎo)讀54.1函數(shù)的定義與調(diào)用
在程序設(shè)計(jì)里,函數(shù)是用來(lái)實(shí)現(xiàn)特定功能的可重復(fù)使用的代碼段,是用于構(gòu)建更大、更復(fù)雜程序的部件。在Python中,使用函數(shù)可以加強(qiáng)代碼的復(fù)用性、減少代碼冗余,從而提高程序編寫的效率。
函數(shù)必須先創(chuàng)建(定義)才可以使用,用戶通過(guò)調(diào)用函數(shù)名來(lái)完成相應(yīng)代碼段的功能,無(wú)需關(guān)心具體實(shí)現(xiàn)的細(xì)節(jié),只需傳遞參數(shù),得到函數(shù)運(yùn)行的最終結(jié)果即可。相同的函數(shù)可以在一個(gè)或多個(gè)程序里多次調(diào)用。舉個(gè)例子,譬如:利用凈水器對(duì)自來(lái)水進(jìn)行深度處理,假設(shè)把凈水器比作是一個(gè)函數(shù),該函數(shù)把一步一步的對(duì)水進(jìn)行過(guò)濾處理的過(guò)程封裝了起來(lái),用戶無(wú)需關(guān)心具體的處理過(guò)程,只需要傳遞參數(shù)(自來(lái)水),然后讓凈水器自動(dòng)運(yùn)行,最終就可獲得處理結(jié)果(凈化后的水)。
4.1函數(shù)的定義與調(diào)用4.1.1函數(shù)的定義Python中的函數(shù)分為:內(nèi)置函數(shù)、自定義函數(shù)和匿名函數(shù)。1.內(nèi)置函數(shù)是系統(tǒng)中預(yù)先定義好的一些常用函數(shù)和方法,這些函數(shù)不需要引用庫(kù),直接使用即可。如:數(shù)學(xué)運(yùn)算類的函數(shù)(sum()、eval())、IO操作類的函數(shù)(input()、print())、標(biāo)準(zhǔn)庫(kù)中的函數(shù)(datetime庫(kù)中的today()、now())等。Python的內(nèi)置函數(shù)如表4-1所示。4.1函數(shù)的定義與調(diào)用表4-1Python的內(nèi)置函數(shù)表abs()delattr()hash()memoryview()set()all()dict()help()min()setattr()any()dir()hex()next()slice()ascii()divmod()id()object()sorted()bin()enumerate()input()oct()staticmethod()bool()eval()int()open()str()bytes()exec()isinstance()ord()sum()bytearray()filter()issubclass()pow()super()complex()float()iter()print()tuple()callable()format()len()property()type()chr()frozenset()list()range()vars()classmethod()getattr()locals()repr()zip()compile()globals()map()reversed()__import__()
hasattr()max()round()
4.1函數(shù)的定義與調(diào)用2.自定義函數(shù)是由用戶自己定義的。定義一個(gè)函數(shù)要使用def語(yǔ)句,語(yǔ)法格式如下:def函數(shù)名(參數(shù)1,參數(shù)2,...,參數(shù)n):
函數(shù)體(語(yǔ)句塊)
return值def:英文單詞define的簡(jiǎn)寫,是定義函數(shù)的關(guān)鍵詞。
函數(shù)名:函數(shù)的名稱,必須符合Python中的命名要求,一般用小寫字母和單下畫線、數(shù)字等組合,如:my_sum、func1等。函數(shù)名后的:(冒號(hào))必不可少。
參數(shù):參數(shù)寫在函數(shù)名后的圓括號(hào)里,為函數(shù)體提供數(shù)據(jù),參數(shù)個(gè)數(shù)不限,可以是0個(gè),1個(gè)或多個(gè)。
函數(shù)體:進(jìn)行一系列邏輯計(jì)算的語(yǔ)句塊,相對(duì)于def縮進(jìn)四個(gè)空格。
返回值:函數(shù)執(zhí)行完畢后返回給調(diào)用者的數(shù)據(jù)。返回值沒(méi)有類型及個(gè)數(shù)限制,若有返回值,則使用return結(jié)束函數(shù)并返回值,否則不帶return表達(dá)式相當(dāng)于返回None。Python函數(shù)有兩種類型參數(shù),一種是函數(shù)定義里的形參,一種是調(diào)用函數(shù)時(shí)傳入的實(shí)參。接下來(lái)通過(guò)一個(gè)簡(jiǎn)單的例子,深入理解函數(shù)。4.1函數(shù)的定義與調(diào)用實(shí)例4-2編寫程序比較2個(gè)數(shù)的大小,輸出2個(gè)數(shù)的最大值。(有參函數(shù))defmax(num1,num2):
ifnum1>num2:max=num1
elsemax=num2
returnmaxmax1=max(2,15)print("最大值是:",max1)該程序輸出結(jié)果如下:最大值是:15
在函數(shù)定義階段括號(hào)內(nèi)有參數(shù),稱為有參函數(shù),調(diào)用時(shí)必須傳入實(shí)際參數(shù)。如果函數(shù)體代碼需要依賴外部傳入的值,必須定義為有參函數(shù)。4.1函數(shù)的定義與調(diào)用3.匿名函數(shù)
lambda函數(shù)也稱匿名函數(shù),即沒(méi)有函數(shù)名的函數(shù)。lambda只是一個(gè)單行的表達(dá)式,函數(shù)體比def簡(jiǎn)單很多,其語(yǔ)法結(jié)構(gòu)如下:
lambda參數(shù)1,參數(shù)2,,...參數(shù)N:表達(dá)式
單行表達(dá)式?jīng)Q定了lambda函數(shù)只能完成非常簡(jiǎn)單的功能。實(shí)例4-3lambda函數(shù)示例f=lambdax,y:x*yf(2,3)6
函數(shù)輸入?yún)?shù)x和y,輸出值是積x*y,并將輸出值賦給變量f,變量f成為具有乘法功能的函數(shù)。
4.1.2函數(shù)的調(diào)用
函數(shù)在定義的階段不會(huì)立即執(zhí)行,而是等函數(shù)被程序調(diào)用時(shí)才執(zhí)行。對(duì)實(shí)例4-2的程序執(zhí)行流程分析如下:
1.程序運(yùn)行時(shí),首先跳過(guò)def塊定義的函數(shù)代碼,而從主程序的第一行,也就是圖中第5行標(biāo)注的max1=max(2,15)這行開(kāi)始運(yùn)行,即調(diào)用函數(shù)max。2.程序在調(diào)用處暫停(圖中第5行)執(zhí)行,然后跳轉(zhuǎn)到def定義的函數(shù)體的第一行,并將實(shí)參2傳遞給形參num1,實(shí)參15傳遞給形參num2,即num1=2,num2=15。4.1函數(shù)的定義與調(diào)用4.1函數(shù)的定義與調(diào)用
3.繼續(xù)執(zhí)行完函數(shù)體中的所有語(yǔ)句,計(jì)算出max=15,再跳回到程序暫停處(圖中第5行)繼續(xù)執(zhí)行,將數(shù)值15作為函數(shù)返回值,即max(2,15)=15,得到max1=15。4.繼續(xù)執(zhí)行完主程序中的所有語(yǔ)句,輸出max1。Python函數(shù)必須先定義后調(diào)用,函數(shù)一旦定義后就可以反復(fù)調(diào)用,從而避免代碼冗余。4.2參數(shù)與返回值
4.2.1默認(rèn)參數(shù)
定義函數(shù)時(shí),如果給參數(shù)設(shè)置了默認(rèn)值,當(dāng)調(diào)用該函數(shù)時(shí)沒(méi)有傳遞對(duì)應(yīng)的實(shí)參,就會(huì)使用這個(gè)默認(rèn)值。示例如下:實(shí)例4-4默認(rèn)參數(shù)示例>>>defadd(a,b=1):returna+b>>>add(2)3>>>add(2,3)54.2參數(shù)與返回值
4.2.2關(guān)鍵字參數(shù)
實(shí)參默認(rèn)情況下是按位置從左至右順序傳遞給函數(shù),而關(guān)鍵字參數(shù)通過(guò)“鍵-值”形式加以指定,允許通過(guò)變量名進(jìn)行匹配,而不是通過(guò)位置,從而讓函數(shù)更加清晰。例如:實(shí)例4-5關(guān)鍵字參數(shù)示例>>>deffunc(a,b,c): print(a,b,c)>>>func(1,2,3)#順序傳遞,1傳給a,2傳給b,3傳給c1,2,3>>>func(c=3,a=1,b=2)#關(guān)鍵字參數(shù)1,2,3采用關(guān)鍵字參數(shù)后,參數(shù)通過(guò)變量名進(jìn)行傳遞,參數(shù)的位置可以任意調(diào)整。4.2參數(shù)與返回值
實(shí)例4-1無(wú)參函數(shù)deffunc():
print("Pythonisinteresting!")func()該程序輸出結(jié)果如下:Pythonisinteresting!
在函數(shù)定義階段括號(hào)內(nèi)沒(méi)有參數(shù),稱為無(wú)參函數(shù),調(diào)用時(shí)也無(wú)需傳入?yún)?shù)。如果函數(shù)體的代碼邏輯不需要依賴外部傳入的值,必須定義為無(wú)參函數(shù)。
這個(gè)函數(shù)的作用就是打印出一句話,但是沒(méi)有return,相當(dāng)于返回的值是None。4.2參數(shù)與返回值
4.2.3可變長(zhǎng)參數(shù)
可變長(zhǎng)參數(shù)就是向一個(gè)函數(shù)傳遞不定個(gè)數(shù)的參數(shù)。例如,我們要定義一個(gè)函數(shù)用于計(jì)算咖啡店每單的銷售額,由于每單的咖啡品種及數(shù)量都不一樣,因此傳入的參數(shù)個(gè)數(shù)也就不同,這個(gè)時(shí)候后就可以使用可變長(zhǎng)參數(shù)來(lái)定義函數(shù)。
可變長(zhǎng)參數(shù),一種在參數(shù)前加一個(gè)星號(hào)(*),數(shù)據(jù)結(jié)構(gòu)為元組;另一種在參數(shù)前加兩個(gè)星號(hào)(**),數(shù)據(jù)結(jié)構(gòu)為字典。示例如下:實(shí)例4-6可變長(zhǎng)參數(shù)示例1>>>deff1(a,*args):
print(a,args)>>>f1(1,2,3,4)1(2,3,4)1按照位置傳遞給a;2、3、4被當(dāng)做元組類型數(shù)據(jù)傳遞給args。4.2參數(shù)與返回值
實(shí)例4-7可變長(zhǎng)參數(shù)示例2>>>deftest(**kwargs):
print(kwargs)
print(type(kwargs))
forkey,valueinkwargs.items():
print("{}={}".format(key,value))>>>test(name='jerry',age=18,address='kunming')該程序輸出結(jié)果為:{'age':18,'name':'jerry','address':'kunming'}<class'dict'>age=18name=jerryaddress=kunmingkwargs是一個(gè)字典,傳入的參數(shù)以鍵值對(duì)的形式存放到字典里。參數(shù)定義的順序必須是:必選參數(shù)–>默認(rèn)參數(shù)–>可變長(zhǎng)參數(shù)。4.2參數(shù)與返回值
4.2.4返回值
return語(yǔ)句用于結(jié)束函數(shù),并將結(jié)果及控制權(quán)返回給調(diào)用者。執(zhí)行到return語(yǔ)句時(shí),會(huì)退出函數(shù),return之后的語(yǔ)句不再執(zhí)行。
在實(shí)際編程環(huán)境中,一些函數(shù)沒(méi)有return語(yǔ)句,只需要干活,不需要返回值(返回None),譬如,實(shí)例4-1定義的函數(shù)就只干活(打印語(yǔ)句)。但在大部分情況下,函數(shù)的運(yùn)行結(jié)果需要用在其它運(yùn)算中,所以函數(shù)必須返回一個(gè)結(jié)果,而不是只局限于把結(jié)果打印出來(lái)。接下來(lái),通過(guò)幾個(gè)微實(shí)例進(jìn)行分析。1.無(wú)返回值的函數(shù)實(shí)例4-8無(wú)返回值的函數(shù)示例1>>>deftest1():
print(“Iamrunningatest”)>>>a=test1()>>>print(a)該程序輸出結(jié)果為:IamrunningatestNone
上面這個(gè)函數(shù)沒(méi)有return語(yǔ)句,返回給變量a的是None(無(wú)返回值),None沒(méi)什么利用價(jià)值,所以無(wú)需用一個(gè)變量來(lái)存儲(chǔ)。通常采用以下的方式進(jìn)行調(diào)用。4.2參數(shù)與返回值
實(shí)例4-9無(wú)返回值的函數(shù)示例2>>>deftest1():
print(“Iamrunningatest”)>>>test1() 該程序輸出結(jié)果為:Iamrunningatest2.有返回值的函數(shù)實(shí)例4-10有返回值的函數(shù)示例>>>defsquare_sum(a,b):c=a**2+b**2
returnc>>>s=square_sum(1,2)>>>print(s)該程序輸出結(jié)果為:54.2.4返回值
3.返回多個(gè)值
return也可以返回多個(gè)值,多個(gè)值以元組類型返回。實(shí)例4-11返回多個(gè)值的函數(shù)示例>>>deftest2():return1,2,3,4,5,6>>>a=test2()>>>print(a)該程序輸出結(jié)果為:(1,2,3,4,5,6)4.3變量的作用域
作用域就是一個(gè)變量的可用范圍,由變量名被賦值的位置所決定,根據(jù)作用域的不同可將變量分為兩類:局部變量和全局變量。4.3.1局部變量
局部變量是指定義在函數(shù)內(nèi)部的變量,其作用域是局部的,只能被函數(shù)內(nèi)部引用,在函數(shù)外無(wú)效。例如:實(shí)例4-12變量示例1>>>deffunc():a=123#a是局部變量print(a)>>>func()1234.3變量的作用域
局部變量只能在函數(shù)內(nèi)部使用,一旦函數(shù)運(yùn)行退出后,局部作用域被銷毀,局部變量就不存在了,超出函數(shù)體的范圍引用就會(huì)出錯(cuò),例如:實(shí)例4-13變量示例2>>>deffunc():a=123>>>func()>>>print(a)此時(shí),會(huì)得到一個(gè)錯(cuò)誤提示:NameError:name'a'isnotdefined4.3變量的作用域4.3.2全局變量全局變量一般定義在所有函數(shù)體之外,其作用域是全局的,在程序整個(gè)運(yùn)行過(guò)程中都有效。
若在函數(shù)體內(nèi)定義全局變量(將內(nèi)部作用域修改為全局作用域的變量),必須在定義的時(shí)候加上關(guān)鍵詞global。例如:實(shí)例4-14變量示例3>>>s=0#全局變量>>>defadd(a,b):
s=a+b#此處的s為局部變量print(s)>>>add(1,2)>>>print(s)運(yùn)行結(jié)果為:
304.3變量的作用域
從以上結(jié)果得知,add()函數(shù)將s當(dāng)作局部變量,add()運(yùn)行退出后,釋放s,而函數(shù)體外的全局變量s的值仍然為0,沒(méi)有被更改。如果在add()函數(shù)內(nèi)的變量s前加上關(guān)鍵詞global,則運(yùn)行結(jié)果會(huì)發(fā)生改變。示例如下:
實(shí)例4-15變量示例4s=0#全局變量>>>defadd(a,b)
globals#s定義為全局變量
s=a+b
print(s)>>>add(1,2)>>>print(s)運(yùn)行結(jié)果為:
34.3變量的作用域
函數(shù)內(nèi)的s加上關(guān)鍵字global后,變成了全局作用域的變量,add(1,2)函數(shù)運(yùn)行后隨即改變了全局變量s的值。全局變量在函數(shù)內(nèi)部不經(jīng)過(guò)聲明也可以被引用,例如:實(shí)例4-16變量示例5>>>x,y=1,2#x,y均為全局變量>>>deffunc():
globalz#z定義為全局變量
z=x*y#引用全局變量x和y
returnz>>>func()運(yùn)行結(jié)果為:24.3變量的作用域
通過(guò)以上幾個(gè)實(shí)例的學(xué)習(xí),我們對(duì)變量的作用域總結(jié)如下:1)一個(gè)函數(shù)內(nèi)的局部變量不能被其它函數(shù)引用。2)局部變量不能被全局作用域中的代碼引用。3)局部作用域內(nèi)可以訪問(wèn)全局變量。
此外,雖然全局變量和局部變量可以使用相同的變量名,也就是同名的不同變量,不過(guò)這種做法容易造成程序出錯(cuò),所以通常建議局部變量和全局變量使用不同的名字。4.4遞歸
遞歸指的是函數(shù)直接或間接地調(diào)用自身以進(jìn)行循環(huán)的方式。使用遞歸關(guān)鍵在于將問(wèn)題分解為更為簡(jiǎn)單的子問(wèn)題,遞歸不能無(wú)限制的調(diào)用本身,否則會(huì)耗盡資源,最終必須以一個(gè)或多個(gè)基本實(shí)例(非遞歸狀況)結(jié)束。
斐波那契數(shù)列又稱黃金分割數(shù)列,是最典型的一個(gè)遞歸例子,由數(shù)學(xué)家列昂納多·斐波那契以兔子繁殖為例子而引入,指的是這樣一個(gè)數(shù)列:0,1,1,2,3,5,8,13,21,34,……。該數(shù)列的第0項(xiàng)是0,第1項(xiàng)是第一個(gè)1,從第二項(xiàng)以后的每一項(xiàng)都等于前兩項(xiàng)之和。斐波納契數(shù)列通常按照遞推方法定義如下:
F(n)=F(n-1)+F(n-2)
我們可以用遞歸函數(shù)來(lái)實(shí)現(xiàn)斐波那契數(shù)列的計(jì)算。4.4遞歸實(shí)例4-8根據(jù)用戶輸入的整數(shù)n,計(jì)算輸出斐波那契數(shù)列的第n個(gè)數(shù)。#fibo.pydeffibo(n):ifn==0:return0elif
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人教A版八年級(jí)歷史下冊(cè)階段測(cè)試試卷含答案
- 2025年浙教版選擇性必修1歷史下冊(cè)月考試卷含答案
- 2025年度醫(yī)療健康產(chǎn)業(yè)融資擔(dān)保合同范文4篇
- 二零二五年度綠色農(nóng)產(chǎn)品生產(chǎn)基地承包合同范本4篇
- 二零二五年度美甲培訓(xùn)學(xué)校校企合作合同4篇
- 二零二五年度貨物買賣合同標(biāo)的商品的規(guī)格和質(zhì)量要求2篇
- 二零二五年度農(nóng)業(yè)合作社股權(quán)收益權(quán)互換合同4篇
- 二零二五年機(jī)械設(shè)備買賣合同5篇
- 二零二五年度木制家具組裝清包服務(wù)合同3篇
- 二零二五年度充電樁充電技術(shù)研發(fā)與產(chǎn)業(yè)化合同4篇
- 《電力用直流電源系統(tǒng)蓄電池組遠(yuǎn)程充放電技術(shù)規(guī)范》
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化運(yùn)維服務(wù)信息化運(yùn)維方案
- 汽車修理廠員工守則
- 六年級(jí)上冊(cè)數(shù)學(xué)應(yīng)用題100題
- 個(gè)人代賣協(xié)議
- 公安交通管理行政處罰決定書式樣
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
- 冀教版數(shù)學(xué)七年級(jí)下冊(cè)綜合訓(xùn)練100題含答案
- 1神經(jīng)外科分級(jí)護(hù)理制度
- 場(chǎng)館惡劣天氣處置應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論