




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章函數(shù)與模塊《Python程序設(shè)計(jì)現(xiàn)代方法(第2版)》學(xué)習(xí)目標(biāo)/Target
了解函數(shù),能夠說(shuō)出函數(shù)的概念以及好處
掌握函數(shù)的定義與調(diào)用,能夠正確地定義并調(diào)用函數(shù)
掌握函數(shù)參數(shù)的傳遞方式,能夠通過(guò)多種方式給函數(shù)的參數(shù)傳遞數(shù)據(jù)掌握函數(shù)的返回值,能夠根據(jù)需要使用return語(yǔ)句返回函數(shù)處理結(jié)果掌握變量作用域,能夠說(shuō)出全局變量和局部變量的特點(diǎn)學(xué)習(xí)目標(biāo)/Target
掌握遞歸函數(shù)的使用,能夠運(yùn)用遞歸函數(shù)解決階乘的問(wèn)題
掌握匿名函數(shù)的使用,能夠運(yùn)用匿名函數(shù)簡(jiǎn)化簡(jiǎn)單函數(shù)的定義
掌握模塊的導(dǎo)入與使用,能夠通過(guò)不同語(yǔ)句導(dǎo)入模塊并使用模塊的內(nèi)容
掌握模塊的變量,能夠歸納變量__all__和__name__的作用章節(jié)概述/Summary程序開(kāi)發(fā)過(guò)程中,隨著需要處理的問(wèn)題變得越來(lái)越難,程序也會(huì)變得越來(lái)越長(zhǎng)。冗長(zhǎng)的程序牽扯的情況比較復(fù)雜,這不僅增加了閱讀和理解的難度,也不利于后期對(duì)程序的維護(hù)與二次開(kāi)發(fā)。函數(shù)和模塊的出現(xiàn)便解決這些問(wèn)題,它們?yōu)殚_(kāi)發(fā)人員提供了豐富的工具和自由度,使得開(kāi)發(fā)各種復(fù)雜的程序變得更加簡(jiǎn)單和高效。本章將詳細(xì)介紹函數(shù)的相關(guān)知識(shí),并簡(jiǎn)要介紹一些關(guān)于模塊的知識(shí)。目錄/Contents01函數(shù)概述函數(shù)的基礎(chǔ)知識(shí)函數(shù)的參數(shù)傳遞0203函數(shù)的返回值04目錄/Contents05變量作用域?qū)嵗褐悄芰奶鞕C(jī)器人函數(shù)的特殊形式0607模塊08函數(shù)概述6.16.1函數(shù)概述通常,處理復(fù)雜問(wèn)題的基本方法是“化繁為簡(jiǎn),分而治之”,也就是說(shuō)將復(fù)雜的問(wèn)題分解成若干個(gè)足夠小的問(wèn)題,逐個(gè)解決這些小問(wèn)題,最終達(dá)到解決大問(wèn)題的目的。例如,把大象裝進(jìn)冰箱可分成三步,分別是打開(kāi)冰箱門(mén)、把大象放進(jìn)去、關(guān)上冰箱門(mén)。只要逐個(gè)解決上述的小問(wèn)題,便能解決最初設(shè)定的大問(wèn)題。同理,在設(shè)計(jì)程序時(shí),可以先將程序拆解成若干個(gè)小功能,然后逐個(gè)實(shí)現(xiàn)這些小的功能。程序開(kāi)發(fā)時(shí),這些小功能可以使用函數(shù)來(lái)封裝。6.1函數(shù)概述函數(shù)是一段有組織、可重復(fù)使用的、用來(lái)實(shí)現(xiàn)單一或相關(guān)聯(lián)功能的代碼段,通過(guò)函數(shù)名稱(chēng)進(jìn)行調(diào)用。函數(shù)可以看作是一段有名字的子程序,可以在需要的地方使用函數(shù)名調(diào)用執(zhí)行。6.1函數(shù)概述函數(shù)是一種功能抽象,它可以實(shí)現(xiàn)特定的功能,就像黑箱模型一樣。黑箱模型是指所建立的模型只考慮輸入與輸出,而與過(guò)程、機(jī)理無(wú)關(guān)?,F(xiàn)實(shí)生活中,許多實(shí)物應(yīng)用了黑箱原理,比如洗衣機(jī)。使用者只需要了解洗衣機(jī)的使用方法,將洗衣粉和水放入洗衣機(jī)中,就可以得到洗干凈的衣服。同樣地,對(duì)于函數(shù),外界不需要了解其內(nèi)部的實(shí)現(xiàn)原理,只需要了解函數(shù)的輸入輸出方式即可使用。換言之,調(diào)用函數(shù)時(shí)以不同的參數(shù)作為輸入,以執(zhí)行函數(shù)后以函數(shù)的返回值作為輸出。6.1函數(shù)概述函數(shù)大體可以劃分為兩類(lèi),一類(lèi)是系統(tǒng)內(nèi)置的函數(shù),它們由Python標(biāo)準(zhǔn)庫(kù)提供,例如,前面章節(jié)中學(xué)習(xí)的print()、input()、type()、int()等函數(shù);另一類(lèi)是自定義函數(shù),即用戶(hù)根據(jù)需求定義的具有特定功能的一段代碼。自定義函數(shù)像一個(gè)具有某種特殊功能的容器——將多條語(yǔ)句組成一個(gè)有名稱(chēng)的代碼段,以實(shí)現(xiàn)具體的功能。6.1函數(shù)概述使用函數(shù)的好處主要體現(xiàn)在以下幾方面:提高代碼的可讀性和可維護(hù)性。將功能封裝成函數(shù),可以使代碼更加模塊化,易于理解和修改。減少代碼的重復(fù)性。通過(guò)函數(shù)封裝重復(fù)的功能,可以避免代碼冗余,提高代碼的復(fù)用性。提高程序的可擴(kuò)展性。使用函數(shù)可以將不同的功能組合在一起,從而實(shí)現(xiàn)更復(fù)雜的功能。提高程序的可靠性。將功能封裝成函數(shù)可以減少代碼中的錯(cuò)誤,降低程序出錯(cuò)的風(fēng)險(xiǎn)。提高程序的性能。通過(guò)函數(shù)封裝重復(fù)的功能,可以減少代碼執(zhí)行的時(shí)間和空間復(fù)雜度,提高程序的性能。函數(shù)的基礎(chǔ)知識(shí)6.26.2.1函數(shù)的定義Python使用def關(guān)鍵字定義函數(shù),基本語(yǔ)法格式如下:關(guān)鍵字def:標(biāo)志著函數(shù)的開(kāi)始。函數(shù)名:函數(shù)的唯一標(biāo)識(shí),其命名方式遵循標(biāo)識(shí)符的命名規(guī)則。參數(shù)列表:可以有零個(gè)、一個(gè)或多個(gè)參數(shù),多個(gè)參數(shù)之間使用英文逗號(hào)分隔。根據(jù)參數(shù)的有無(wú),函數(shù)分為有參函數(shù)和無(wú)參函數(shù)。冒號(hào):用于標(biāo)記函數(shù)體的開(kāi)始。文檔字符串:用于描述函數(shù)的功能,可以省略。函數(shù)體:函數(shù)每次調(diào)用時(shí)執(zhí)行的代碼,由一行或多行語(yǔ)句構(gòu)成。return語(yǔ)句:標(biāo)志著函數(shù)的結(jié)束,用于將函數(shù)的處理結(jié)果返回給函數(shù)調(diào)用者。若函數(shù)需要返回值,則使用return語(yǔ)句返貨,否則return語(yǔ)句可以省略。def函數(shù)名([參數(shù)列表]):['''文檔字符串''']
函數(shù)體 [return語(yǔ)句]6.2.1函數(shù)的定義定義函數(shù)時(shí),函數(shù)參數(shù)列表中的參數(shù)是形式參數(shù),簡(jiǎn)稱(chēng)為“形參”,形參用來(lái)接收調(diào)用函數(shù)時(shí)傳入函數(shù)的參數(shù)。注意,形參只會(huì)在函數(shù)被調(diào)用的時(shí)候才分配內(nèi)存空間,一旦調(diào)用結(jié)束就會(huì)即刻釋放,因此,形參只有在函數(shù)內(nèi)部有效。defmy_absolute(x):ifx>=0:print(x)else:print(-x)定義一個(gè)求絕對(duì)值的函數(shù),示例如下:6.2.2函數(shù)的調(diào)用函數(shù)定義好之后不會(huì)立即執(zhí)行,直到被程序調(diào)用時(shí)才會(huì)生效。調(diào)用函數(shù)的方式非常簡(jiǎn)單,一般形式如下:函數(shù)名([參數(shù)列表])例如,調(diào)用6.2.1中定義好的my_absolute()函數(shù),代碼如下:my_absolute(-10.0)以上形式的參數(shù)列表中的參數(shù)是實(shí)際參數(shù),簡(jiǎn)稱(chēng)為“實(shí)參”,它們可以是常量、變量、表達(dá)式、函數(shù)等,這些實(shí)參會(huì)根據(jù)它們?cè)诤瘮?shù)定義中出現(xiàn)的順序或名稱(chēng)與函數(shù)中的形參進(jìn)行匹配,并在匹配成功后被傳遞給形參。6.2.2函數(shù)的調(diào)用程序在執(zhí)行時(shí),若遇到函數(shù)調(diào)用,會(huì)經(jīng)歷以下流程:程序在函數(shù)調(diào)用處暫停執(zhí)行;將實(shí)參傳入函數(shù)的形參;執(zhí)行函數(shù)體中的語(yǔ)句;程序接收函數(shù)的返回值并繼續(xù)執(zhí)行。若函數(shù)沒(méi)有返回值,則會(huì)省略接收返回值的步驟。6.2.2函數(shù)的調(diào)用下面以my_absolute()函數(shù)為例,為大家介紹函數(shù)的調(diào)用過(guò)程。假設(shè)定義和調(diào)用my_absolute()函數(shù)的完整代碼如下:defmy_absolute(x):ifx>=0:print(x)else:print(-x)my_absolute(-10.0)print("---程序結(jié)束---")函數(shù)的參數(shù)傳遞6.36.3.1位置傳遞當(dāng)調(diào)用函數(shù)時(shí),默認(rèn)情況下實(shí)參會(huì)按照位置順序傳遞給對(duì)應(yīng)的形參,即將第一個(gè)實(shí)參傳遞給第一個(gè)形參,第二個(gè)實(shí)參傳遞給第二個(gè)形參,以此類(lèi)推。deftest_param(a,b,c):print(a,b,c)test_param(1,2,3)6.3.2關(guān)鍵字傳遞雖然位置傳遞的方式比較便捷,但是如果形參的數(shù)目過(guò)多,開(kāi)發(fā)者很難記住每個(gè)形參的作用,這時(shí)可以通過(guò)關(guān)鍵字傳遞的方式給形參傳值,這里的關(guān)鍵字就是形參的名稱(chēng)。當(dāng)調(diào)用函數(shù)時(shí),通過(guò)“形參名=實(shí)參”的形式將形參與實(shí)參關(guān)聯(lián),按照形參的名稱(chēng)進(jìn)行參數(shù)傳遞,它允許實(shí)參和形參的順序不一致。deftest_param(a,b,c):print(a,b,c)test_param(a=1,c=3,b=2)多學(xué)一招:僅限位置和權(quán)限關(guān)鍵字僅限位置,顧名思義就是調(diào)用函數(shù)時(shí)只能根據(jù)位置將實(shí)參傳遞給形參,不能再根據(jù)關(guān)鍵字將實(shí)參傳遞給形參。當(dāng)定義函數(shù)時(shí),只要在函數(shù)的形參前面明確使用符號(hào)/,那么/前面的形參需要嚴(yán)格遵守僅限位置的要求。deftest_param(a,b,/,c):#定義函數(shù),部分參數(shù)遵守僅限位置的要求print(a,b,c)test_param(1,2,3)test_param(1,2,c=3)1.僅限位置多學(xué)一招:僅限位置和權(quán)限關(guān)鍵字僅限關(guān)鍵字,顧名思義就是調(diào)用函數(shù)時(shí)只能根據(jù)關(guān)鍵字將實(shí)參傳遞給形參,不能再根據(jù)位置將實(shí)參傳遞給形參。當(dāng)定義函數(shù)時(shí),只要在函數(shù)的形參前面明確使用符號(hào)*,那么符號(hào)*后面的形參需要嚴(yán)格遵守僅限關(guān)鍵字的要求。2.僅限關(guān)鍵字deftest_param(a,*,b,c):#定義函數(shù),部分參數(shù)遵守僅限關(guān)鍵字的要求print(a,b,c)test_param(1,b=2,c=3)test_param(a=1,b=2,c=3)6.3.3默認(rèn)值傳遞在定義函數(shù)時(shí)可以給每個(gè)形參指定默認(rèn)值,基本形式為“形參名=默認(rèn)值”,這樣在調(diào)用時(shí)既可以給帶有默認(rèn)值的形參傳遞實(shí)參,以便重新為該形參賦值,也可以省略相應(yīng)的實(shí)參,使用形參的默認(rèn)值。deftest_param(a,b,c=6print(a,b,c)test_param(1,2,3)test_param(1,2)6.3.4包裹傳遞若函數(shù)在定義時(shí)無(wú)法確定接收多少個(gè)實(shí)參,那么可以在定義函數(shù)時(shí)給形參名稱(chēng)添加“*”或“**”。若一個(gè)形參名稱(chēng)前面加上“*”,它可以接收一個(gè)以元組形式包裹的多個(gè)實(shí)參。若一個(gè)形參名稱(chēng)前面加上“**”,它可以接收一個(gè)以字典形式包裹的多個(gè)實(shí)參。例如,定義一個(gè)形參為*args的函數(shù),代碼如下deftest_param(*args):#定義函數(shù),該函數(shù)有一個(gè)加*的形參print(args)調(diào)用以上定義的test_param()函數(shù)可以傳入多個(gè)實(shí)參,比如傳入5個(gè)實(shí)參,代碼如下:
test_param(1,2,3,4,5)6.3.4包裹傳遞例如,定義一個(gè)形參為**kwargs的函數(shù),代碼如下:deftest_param(**kwargs):#定義函數(shù),該函數(shù)有一個(gè)加**的形參print(kwargs)調(diào)用以上定義的test_param()函數(shù)時(shí)可以傳入多個(gè)實(shí)參,比如傳入5個(gè)實(shí)參,代碼如下:test_param(a=1,b=2,c=3,d=4,e=5)6.3.5解包裹傳遞在調(diào)用函數(shù)時(shí),若函數(shù)接收的實(shí)參為元組或字典類(lèi)型,可以使用“*”和“**”對(duì)實(shí)參解包裹,將實(shí)參拆分為多個(gè)值,并按照位置傳遞或關(guān)鍵字傳遞的方式將實(shí)參賦給形參。deftest_param(a,b,c):print(a,b,c)tuple_demo=(1,2,3)test_param(*tuple_demo)#調(diào)用函數(shù),使用*對(duì)實(shí)參解包裹6.3.5解包裹傳遞下面再來(lái)看一下對(duì)字典解包裹的示例,代碼如下:dict_demo={'a':1,'b':2,'c':3}test_param(**dict_demo)#調(diào)用函數(shù),使用**對(duì)實(shí)參解包裹6.3.6混合傳遞前面介紹的幾種參數(shù)傳遞的方式可以混合使用,但是在定義函數(shù)或調(diào)用函數(shù)時(shí)需要注意前后的順序。在定義函數(shù)時(shí),帶默認(rèn)值的形參必須位于普通形參(不帶默認(rèn)值或標(biāo)識(shí)的形參)之后,帶“**”標(biāo)識(shí)的形參必須位于帶“*”標(biāo)識(shí)的形參之后。6.3.6混合傳遞當(dāng)調(diào)用具有以上幾種形參的函數(shù)時(shí),需要遵循一定的規(guī)則:優(yōu)先按照位置傳遞;其次按照關(guān)鍵字傳遞;再次按照默認(rèn)值傳遞;最后按照包裹傳遞。6.3.6混合傳遞例如,定義一個(gè)函數(shù),該函數(shù)包含多種形式的形參,具體代碼如下:deftest_param(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)調(diào)用test_param()函數(shù)時(shí),依次傳入不同個(gè)數(shù)和形式的實(shí)參,具體代碼如下:test_param(1,2)test_param(1,2,c=3)test_param(1,2,3,'a','b')test_param(1,2,3,'a','b',x=99)函數(shù)的返回值6.46.4函數(shù)的返回值函數(shù)中的return語(yǔ)句是可選項(xiàng),它可以出現(xiàn)在函數(shù)體的任何位置,作用是結(jié)束當(dāng)前函數(shù),返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行程序,同時(shí)將函數(shù)處理的結(jié)果返回函數(shù)調(diào)用者。6.4函數(shù)的返回值下面編寫(xiě)一個(gè)函數(shù),該函數(shù)用于判斷鍵盤(pán)輸入的字符串是否以大寫(xiě)字母開(kāi)頭,并返回判斷結(jié)果,示例如下:defis_capital(words):iford("A")<=ord(words[0])<=ord("Z"):return'首字母是大寫(xiě)的'else:return'首字母不是大寫(xiě)的'result=is_capital("Python")#將函數(shù)返回的判斷結(jié)果賦給變量print(result)6.4函數(shù)的返回值函數(shù)中的return語(yǔ)句可以返回多個(gè)值,這些值將以元組形式保存。例如,定義一個(gè)控制游戲角色移動(dòng)的函數(shù)move(),使用return語(yǔ)句返回反應(yīng)角色當(dāng)前位置的nx和ny,代碼如下:defmove(x,y,step):nx=x+stepny=y-stepreturnnx,ny#使用return語(yǔ)句返回多個(gè)值result=move(100,100,60)print(result)變量作用域6.56.5.1局部變量在函數(shù)內(nèi)部定義的變量稱(chēng)為局部變量,局部變量只能在定義它的函數(shù)內(nèi)部使用。局部變量的作用域僅限于定義它的函數(shù)范圍內(nèi),同一個(gè)作用域內(nèi),不允許出現(xiàn)同名變量。deftest():count=0 #定義一個(gè)局部變量print(count) #函數(shù)內(nèi)部訪問(wèn)局部變量test()print(count) #函數(shù)外部訪問(wèn)局部變量例如,定義一個(gè)包含局部變量count的函數(shù)test(),在函數(shù)的內(nèi)部和外部分別訪問(wèn)這個(gè)局部變量count,代碼如下:6.5.2全局變量全局變量是指在整個(gè)程序中都可以使用的變量,它們一般定義在函數(shù)外部,并且在整個(gè)程序運(yùn)行期間占用存儲(chǔ)單元。默認(rèn)情況下,函數(shù)的內(nèi)部只能訪問(wèn)全局變量,而不能修改全局變量的值。6.5.2全局變量count=10#定義一個(gè)全局變量deftest():count=11#函數(shù)內(nèi)部嘗試修改全局變量的值print(count)test()print(count)例如,定義的test()函數(shù),完整代碼如下:運(yùn)行代碼,結(jié)果如下所示:1110函數(shù)的內(nèi)部并沒(méi)有成功修改全局變量的值,而是定義了一個(gè)與全局變量同名的局部變量。6.5.2全局變量在函數(shù)內(nèi)部若要修改全局變量的值,需要在修改之前使用關(guān)鍵字global進(jìn)行聲明,使聲明的變量提升為全局變量,語(yǔ)法格式如下:global全局變量在test()函數(shù)中使用關(guān)鍵字global聲明變量count,并對(duì)變量count進(jìn)行修改,代碼如下:count=10#全局變量deftest():globalcount#提升count為全局變量count=11#函數(shù)內(nèi)修改count的值print(count)test()print(count)多學(xué)一招:LEGB法則LEGB是程序中搜索變量時(shí)所遵循的原則,該原則中的每個(gè)字母指代一種作用域,具體如下:L(local):局部作用域,例如局部變量和形參生效的區(qū)域。;E(enclosing):嵌套作用域,例如嵌套定義的外層函數(shù)中定義的變量生效的區(qū)域。G(global):全局作用域,例如全局變量生效的區(qū)域。B(built-in):內(nèi)置作用域,例如,內(nèi)置模塊定義的變量生效的區(qū)域。Python在搜索變量時(shí)會(huì)按照“L-E-G-B”這個(gè)順序依次在這四種區(qū)域中搜索:若搜索到變量則終止搜索,使用搜索到的變量;若搜索完L、E、G、B這四種區(qū)域仍無(wú)法找到變量,程序會(huì)出現(xiàn)報(bào)錯(cuò)信息。實(shí)例:智能聊天機(jī)器人6.66.6實(shí)例:智能聊天機(jī)器人近年來(lái),智能聊天機(jī)器人在國(guó)內(nèi)得到廣泛應(yīng)用,涵蓋從企業(yè)客戶(hù)服務(wù)到教育和醫(yī)療等領(lǐng)域,解決了人們?nèi)粘I钪械膯?wèn)題,提供了更加便捷、高效、智能的服務(wù)。比如,科大訊飛推出的語(yǔ)音AI主播“小晴”,能夠根據(jù)文本稿件模擬真人聲音進(jìn)行主播工作;深圳某職業(yè)學(xué)校推出的AI識(shí)別模擬考場(chǎng)程序——“AI超級(jí)智能考場(chǎng)監(jiān)考系統(tǒng)”,可自動(dòng)監(jiān)測(cè)學(xué)生考試數(shù)據(jù),為學(xué)生成績(jī)考核提供便利;百度推出的智能聊天機(jī)器人“小度”能夠自然流暢地與用戶(hù)進(jìn)行信息、服務(wù)、情感等多方面的交流。6.6實(shí)例:智能聊天機(jī)器人本實(shí)例要求實(shí)現(xiàn)一個(gè)簡(jiǎn)易智能聊天機(jī)器人——小智,用于幫助用戶(hù)解答百科知識(shí)的問(wèn)題,具體要求如下。(1)機(jī)器人默認(rèn)會(huì)解答5個(gè)問(wèn)題,這5個(gè)問(wèn)題分別是詩(shī)仙是誰(shuí)、中國(guó)第一個(gè)朝代、三十六計(jì)的第一計(jì)是什么、天府之國(guó)是中國(guó)的哪個(gè)地方、中國(guó)第一長(zhǎng)河,答案分別是李白、夏朝、瞞天過(guò)海、四川、長(zhǎng)江。(2)機(jī)器人有3項(xiàng)功能,分別是訓(xùn)練、對(duì)話和離開(kāi),若用戶(hù)從鍵盤(pán)輸入t,說(shuō)明用戶(hù)想訓(xùn)練機(jī)器人,此時(shí)機(jī)器人需要記錄訓(xùn)練的新問(wèn)題及答案;若用戶(hù)從鍵盤(pán)輸入c,說(shuō)明用戶(hù)想跟機(jī)器人對(duì)話,此時(shí)機(jī)器人需要回答用戶(hù)提出的問(wèn)題;若用戶(hù)從鍵盤(pán)輸入l,說(shuō)明讓機(jī)器人離開(kāi),此時(shí)機(jī)器人需要退出程序。6.6實(shí)例:智能聊天機(jī)器人本實(shí)例的實(shí)現(xiàn)思路可以分成以下步驟:(1)定義一個(gè)表示問(wèn)題庫(kù)變量,用于保存機(jī)器人能夠回答的所有問(wèn)題與答案。(2)定義兩個(gè)全局變量,分別用于記錄機(jī)器人初始的狀態(tài)標(biāo)記和工作標(biāo)記。(3)定義一個(gè)用于訓(xùn)練機(jī)器人的函數(shù),該函數(shù)包含兩個(gè)參數(shù),用于接收用戶(hù)輸入的新問(wèn)題及其答案。6.6實(shí)例:智能聊天機(jī)器人本實(shí)例的實(shí)現(xiàn)思路可以分成以下步驟:(4)定義一個(gè)用于跟機(jī)器人對(duì)話的函數(shù),該函數(shù)包含一個(gè)參數(shù),用于接收用戶(hù)提出的問(wèn)題。(5)通過(guò)while語(yǔ)句控制用戶(hù)使用機(jī)器人操作的完整流程。(6)在循環(huán)內(nèi)部,通過(guò)input()函數(shù)接收用戶(hù)輸入的選項(xiàng),通過(guò)if-elif-else語(yǔ)句判斷選項(xiàng)是否為c、t、l或其他這幾種情況,更新機(jī)器人的狀態(tài)標(biāo)記,并在各個(gè)分支下實(shí)現(xiàn)對(duì)應(yīng)的功能。函數(shù)的特殊形式6.76.7.1匿名函數(shù)匿名函數(shù)是一類(lèi)無(wú)須定義標(biāo)識(shí)符的函數(shù),它與普通函數(shù)一樣可以在程序的任何位置使用,但是在定義時(shí)被嚴(yán)格限定為單一表達(dá)式。Python中使用lambda關(guān)鍵字定義匿名函數(shù),它的語(yǔ)法格式如下:lambda<形式參數(shù)列表>:<表達(dá)式>6.7.1匿名函數(shù)與普通函數(shù)相比,匿名函數(shù)的體積更小,功能更單一,它只是一個(gè)為簡(jiǎn)單任務(wù)服務(wù)的對(duì)象,它們的主要區(qū)別如下:普通函數(shù)在定義時(shí)有名稱(chēng),而匿名函數(shù)沒(méi)有名稱(chēng);普通函數(shù)的函數(shù)體中包含有多條語(yǔ)句,而匿名函數(shù)的函數(shù)體只能是一個(gè)表達(dá)式;普通函數(shù)可以實(shí)現(xiàn)比較復(fù)雜的功能,而匿名函數(shù)可實(shí)現(xiàn)的功能比較簡(jiǎn)單;普通函數(shù)能被其他程序使用,而匿名函數(shù)不能被其他程序使用。6.7.1匿名函數(shù)定義好的匿名函數(shù)不能直接使用,最好使用一個(gè)變量保存它,以便后期可以隨時(shí)使用。例如,定義一個(gè)計(jì)算數(shù)值平方的匿名函數(shù),并將其返回值賦值給一個(gè)變量:temp=lambdax:pow(x,2)#定義匿名函數(shù),它返回的函數(shù)對(duì)象賦值給變量temp此時(shí),變量temp可以作為匿名函數(shù)的臨時(shí)名稱(chēng)來(lái)調(diào)用函數(shù),示例如下:result=temp(10)print(result)6.7.2遞歸函數(shù)遞歸是指函數(shù)對(duì)自身的調(diào)用,它可以分為以下兩個(gè)階段:遞推:遞歸本次的執(zhí)行都基于上一次的運(yùn)算結(jié)果?;厮荩河龅浇K止條件時(shí),則沿著遞推往回一級(jí)一級(jí)地把值返回來(lái)。遞歸函數(shù)通常用于解決結(jié)構(gòu)相似的問(wèn)題,其基本的實(shí)現(xiàn)思路是將一個(gè)復(fù)雜的問(wèn)題轉(zhuǎn)化成若干個(gè)子問(wèn)題,子問(wèn)題的形式和結(jié)構(gòu)與原問(wèn)題相似,求出子問(wèn)題的解之后根據(jù)遞歸關(guān)系可以獲得原問(wèn)題的解。6.7.2遞歸函數(shù)遞歸有兩個(gè)基本要素:基例:子問(wèn)題的最小規(guī)模,用于確定遞歸何時(shí)終止,也稱(chēng)為遞歸出口。遞歸模式:將復(fù)雜問(wèn)題分解成若干子問(wèn)題的基礎(chǔ)結(jié)構(gòu),也稱(chēng)為遞歸體。遞歸函數(shù)的一般形式如下:def函數(shù)名稱(chēng)(參數(shù)列表): if基例:
rerun基例結(jié)果 else:
return遞歸體6.7.2遞歸函數(shù)遞歸最經(jīng)典的應(yīng)用就是階乘,例如,求n的階乘,數(shù)學(xué)中使用函數(shù)fact(n)表示:fact(n)=n!=1*2*3*...*(n-1)*n=fact(n-1)*n在程序中定義fact()函數(shù)實(shí)現(xiàn)階乘計(jì)算,可以寫(xiě)成如下形式:deffact(n):ifn==1:#基例return1else:returnfact(n-1)*n#遞歸體6.7.2遞歸函數(shù)假設(shè)現(xiàn)在要求5的階乘,則遞歸函數(shù)的整個(gè)執(zhí)行過(guò)程如圖所示。6.7.2遞歸函數(shù)計(jì)算斐波那契數(shù)列也是遞歸的一個(gè)經(jīng)典應(yīng)用。斐波那契數(shù)列又稱(chēng)黃金分割數(shù)列,這個(gè)數(shù)列從第三項(xiàng)開(kāi)始,它的每一項(xiàng)都等于前兩項(xiàng)的和。在數(shù)學(xué)上,斐波納契數(shù)列以遞推的方式定義,如下所示:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)根據(jù)以上定義,斐波那契數(shù)列的前9項(xiàng)依次為:1、1、2、3、5、8、13、21、34。6.7.2遞歸函數(shù)斐波那契數(shù)列是以兔子繁殖為例子而引入,故又稱(chēng)為“兔子數(shù)列”。兔子繁殖的故事是這樣的,一般兔子在出生兩個(gè)月后就有繁殖能力,一對(duì)兔子每個(gè)月能生出一對(duì)小兔子來(lái),如果所有的兔子都不死,那么一年以后一共有多少對(duì)兔子?6.7.2遞歸函數(shù)下面針對(duì)兔子繁殖的問(wèn)題進(jìn)行具體地分析:第一個(gè)月,兔子沒(méi)有繁殖能力,此時(shí)兔子的總數(shù)量為1對(duì);第二個(gè)月,兔子擁有了繁殖能力,生下一對(duì)小兔子,此時(shí)兔子的總數(shù)量為2對(duì);第三個(gè)月,兔子又生下一對(duì)小兔子,而小兔子沒(méi)有繁殖能力,此時(shí)兔子的總數(shù)量為3對(duì);......依此類(lèi)推,可以得到如下兔子數(shù)量統(tǒng)計(jì)表:經(jīng)過(guò)月份0123456789101112幼崽對(duì)數(shù)101123581321345589成兔對(duì)數(shù)01123581321345589144總體對(duì)數(shù)11235813213455891442336.7.2遞歸函數(shù)使用代碼實(shí)現(xiàn)計(jì)算兔子數(shù)列的函數(shù),具體如下所示:defrabbit(month):
ifmonth==1:
return1
else:
returnrabbit(month-2)+rabbit(month-1)調(diào)用上述函數(shù),可計(jì)算出經(jīng)過(guò)一年以后,兔子的總數(shù)量為,代碼如下:result=rabbit(12)print(result)模塊6.86.8.1模塊的導(dǎo)入和使用1.使用import語(yǔ)句導(dǎo)入模塊import語(yǔ)句支持一次導(dǎo)入一個(gè)模塊,也支持一次導(dǎo)入多個(gè)模塊。使用import語(yǔ)句導(dǎo)入模塊的語(yǔ)法格式如下。import模塊1,模塊2,…例如,導(dǎo)入Python中內(nèi)置的模塊random和time,代碼如下:importtime #導(dǎo)入一個(gè)模塊importrandom,time #導(dǎo)入多個(gè)模塊6.8.1模塊的導(dǎo)入和使用導(dǎo)入模塊以后,可以通過(guò)“.”使用模塊中的內(nèi)容,包括全局變量、函數(shù)或類(lèi)。使用模塊內(nèi)容的語(yǔ)法格式如下。模塊名.變量名/函數(shù)名()/類(lèi)名
例如,使用time模塊中sleep()函數(shù),示例如下:time.sleep(1)使用as關(guān)鍵字給模塊起別名的語(yǔ)法格式如下。import模塊名as別名1.使用import語(yǔ)句導(dǎo)入模塊6.8.1模塊的導(dǎo)入和使用使用import語(yǔ)句導(dǎo)入模塊后,每次使用模塊時(shí)都需要添加“模型名.”前綴,非常繁瑣。為了減少這樣的麻煩,Python提供了另外一種導(dǎo)入模塊的語(yǔ)句from-import-。使用from-import-方式導(dǎo)入模塊之后,無(wú)需添加前綴,可以像使用當(dāng)前程序中的內(nèi)容一樣使用模塊中的內(nèi)容。使用from-import-語(yǔ)句導(dǎo)入模塊的語(yǔ)法格式如下。from模塊名import變量名/函數(shù)名/類(lèi)名例如,導(dǎo)入time模塊中的sleep()函數(shù)和time()函數(shù),具體代碼如下。fromtimeimportsleep,time2.使用from-import-語(yǔ)句導(dǎo)入模塊6.8.1模塊的導(dǎo)入和使用如果希望一次性導(dǎo)入模塊中的全部?jī)?nèi)容,可以將from...import...語(yǔ)句中import后面的內(nèi)容替換為通配符“*”。導(dǎo)入模塊中全部?jī)?nèi)容的語(yǔ)法格式如下。from模塊名import*例如,導(dǎo)入time模塊中的全部?jī)?nèi)容,具體代碼如下。fromtimeimport*2.使用from-import-語(yǔ)句導(dǎo)入模塊6.8.1模塊的導(dǎo)入和使用from-import-語(yǔ)句也支持為模塊或模塊中的內(nèi)容起別名,其語(yǔ)法格式如下。from模塊名import變量名/函數(shù)名/類(lèi)名as別名例如,給time模塊中的sleep()函數(shù)起別名為sl,具體代碼如下。fromtimeimportsleepasslsl(1)#sl為sleep()函數(shù)的別名2.使用from-import-語(yǔ)句導(dǎo)入模塊6.8.2模塊的變量1.
__all__變量Python模塊的開(kāi)頭通常會(huì)定義一個(gè)__all__變量,該變量的值實(shí)際上是一個(gè)列表,列表中包含的元素決定了在使用from-import*語(yǔ)句導(dǎo)入模塊后可以使用模塊的哪些內(nèi)容。如果__all__中只包含模塊中的部分內(nèi)容,那么from-import*語(yǔ)句只會(huì)將__all__中包含的部分內(nèi)容導(dǎo)入程序。6.8.2模塊的變量下面創(chuàng)建兩個(gè)模塊calc.py和test.py,分步驟演示如何通過(guò)__all__變量限制導(dǎo)入這兩個(gè)模塊的內(nèi)容,具體步驟如下。(1)創(chuàng)建模塊calc.py,該模塊中包含一個(gè)__all__變量和四個(gè)計(jì)算兩個(gè)數(shù)的四則運(yùn)算的函數(shù),具體代碼如下:#定義變量__all__,用于限制導(dǎo)入模塊的內(nèi)容__all__=["add","subtract"]defadd(a,b):returna+bdefsubtract(a,b):returna-bdefmultiply(a,b):returna*bdefdivide(a,b):if(b):returna/b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能語(yǔ)音識(shí)別軟件開(kāi)發(fā)合同
- 安全與保密措施表格(特定行業(yè))
- 廣東省深圳市福田區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末生物學(xué)試題(含答案)
- 《中學(xué)語(yǔ)文文學(xué)鑒賞與實(shí)踐活動(dòng)教案》
- 清潔能源工程項(xiàng)目建設(shè)合同
- 框架協(xié)議合同
- 關(guān)于調(diào)整辦公時(shí)間的內(nèi)部通知流程說(shuō)明
- 機(jī)械工程材料性能分析知識(shí)要點(diǎn)
- 關(guān)于職場(chǎng)禮儀的普及
- 物流配送策略對(duì)比表
- GB/T 4292-2017氟化鋁
- GB/T 41-20161型六角螺母C級(jí)
- GB/T 3811-2008起重機(jī)設(shè)計(jì)規(guī)范
- CB/T 615-1995船底吸入格柵
- 11471勞動(dòng)爭(zhēng)議處理(第10章)
- 2022年河南省對(duì)口升學(xué)計(jì)算機(jī)類(lèi)專(zhuān)業(yè)課考試真題卷
- 人工智能賦能教育教學(xué)變革的研究
- 經(jīng)營(yíng)性公墓建設(shè)標(biāo)準(zhǔn)
- 患教-頸動(dòng)脈斑塊課件
- 審計(jì)部組織架構(gòu)及崗位設(shè)置
- 流行性乙型腦炎PPT課件
評(píng)論
0/150
提交評(píng)論