版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目五函
數(shù)項(xiàng)目五在實(shí)際開發(fā)過程中,經(jīng)常會(huì)遇到很多完全相同或非常相似的操作。此時(shí),可以將實(shí)現(xiàn)類似操作的代碼封裝為函數(shù),然后在需要的地方調(diào)用該函數(shù)。這樣不僅可以實(shí)現(xiàn)代碼的復(fù)用,還可以使代碼更有條理性,增加代碼的可靠性。本項(xiàng)目將詳細(xì)介紹Python中函數(shù)的使用方法。函數(shù)項(xiàng)目導(dǎo)讀學(xué)習(xí)目標(biāo)掌握函數(shù)的定義和調(diào)用方法,以及函數(shù)的返回值和參數(shù)的使用方法。理解函數(shù)的嵌套和遞歸。掌握局部變量和全局變量的區(qū)別和典型用法。了解匿名函數(shù)。掌握模塊的導(dǎo)入和創(chuàng)建方法。思政目標(biāo)提高對類似事物歸納總結(jié)的能力,加強(qiáng)團(tuán)隊(duì)合作能力。
學(xué)習(xí)努力拼搏、堅(jiān)持不懈的運(yùn)動(dòng)員精神,以及相互理解、友好、團(tuán)結(jié)和公平競爭的奧林匹克精神。項(xiàng)目五Content項(xiàng)目五制作簡易計(jì)算器解析漢諾問題制作東京奧運(yùn)會(huì)前5獎(jiǎng)牌榜繪制奧運(yùn)五環(huán)標(biāo)志制作簡易計(jì)算器任
務(wù)
一任務(wù)一
簡易計(jì)算器要實(shí)現(xiàn)的功能是對兩個(gè)數(shù)進(jìn)行加法、減法、乘法或除法運(yùn)算,每種運(yùn)算都可以通過一個(gè)函數(shù)實(shí)現(xiàn)。本任務(wù)將帶領(lǐng)大家編寫Python程序,制作簡易計(jì)算器。制作簡易計(jì)算器任務(wù)描述知識鏈接
函數(shù)是一段具有特定功能的、可重復(fù)使用的代碼,它能夠提高程序的模塊化和代碼的復(fù)用率。因此,可以將不同功能的函數(shù)看作是不同形狀的積木,可進(jìn)行隨意拼接和重復(fù)使用。Python提供了很多內(nèi)置函數(shù),如print()、input()、int()函數(shù)等,以及標(biāo)準(zhǔn)庫函數(shù),如math庫中的sqrt()函數(shù)等。除此之外,用戶還可以自己定義函數(shù),稱為自定義函數(shù)。Python中定義函數(shù)的基本語法格式如下。在實(shí)際開發(fā)過程中,為提高代碼的可讀性,會(huì)經(jīng)常使用以下3種命名方式。一、函數(shù)的定義def函數(shù)名([形式參數(shù)列表]):函數(shù)體任務(wù)一其中,def是Python的關(guān)鍵字,用于定義函數(shù);函數(shù)名可以是任何合法的Python標(biāo)識符;形式參數(shù)列表(簡稱形參)是調(diào)用該函數(shù)時(shí)傳遞給函數(shù)的參數(shù),可以是零個(gè)、一個(gè)或多個(gè),當(dāng)傳遞多個(gè)參數(shù)時(shí)各參數(shù)之間使用逗號隔開,[]表示可選內(nèi)容;函數(shù)體是每次調(diào)用函數(shù)執(zhí)行的代碼,由一行或多行語句組成。定義函數(shù)時(shí)須注意以下幾點(diǎn)。
defeat():
print('吃飯')(1)當(dāng)函數(shù)參數(shù)為零個(gè)時(shí),也必須保留一對空的圓括號。(2)圓括號后面的冒號不能省略。(3)函數(shù)體相對于def關(guān)鍵字必須保持一定的空格縮進(jìn)。例如,定義名為eat()的函數(shù),該函數(shù)的功能是輸出“吃飯”字符串,可以用下面代碼實(shí)現(xiàn)。
任務(wù)一函數(shù)的定義、調(diào)用和返回值
函數(shù)名([實(shí)際參數(shù)列表])
函數(shù)定義后,須調(diào)用函數(shù)才能執(zhí)行函數(shù)體,實(shí)現(xiàn)特定的功能。函數(shù)調(diào)用的基本語法格式如下作用是同時(shí)將1賦值給變量a、b和c,相當(dāng)于:其中,實(shí)際參數(shù)列表(簡稱實(shí)參)表示要傳遞給函數(shù)的具體值。任務(wù)一二、函數(shù)的調(diào)用【例5-1】
小藍(lán)的日?;顒?dòng)?!締栴}分析】
定義函數(shù)封裝日?;顒?dòng),然后按作息時(shí)間調(diào)用函數(shù)。例如,定義eat()函數(shù),輸出“吃
飯......”,定義school()函數(shù)輸出“上課......”等。defeat(): #定義eat()函數(shù),表示吃飯print('吃飯......')defschool(): #定義school()函數(shù),表示上課print('上課......')defhomework(): #定義homework()函數(shù),表示做作業(yè)print('做作業(yè)......')defexercise(): #定義exercise()函數(shù),表示運(yùn)動(dòng)print('運(yùn)動(dòng)......')print('小藍(lán)的日?;顒?dòng)')#按作息時(shí)間調(diào)用函數(shù)eat()school()eat()school()exercise()eat()homework()任務(wù)一【參考代碼】任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-1所示。圖5-1例5-1程序運(yùn)行結(jié)果【程序說明】由于函數(shù)只有在調(diào)用時(shí)才執(zhí)行,因此,前面定義函數(shù)的代碼不會(huì)直接執(zhí)行。當(dāng)
調(diào)用函數(shù)時(shí),當(dāng)前執(zhí)行暫停,轉(zhuǎn)去執(zhí)行函數(shù)體。當(dāng)函數(shù)執(zhí)行完畢后,重新回到調(diào)
用函數(shù)位置,繼續(xù)執(zhí)行后面的語句。
函數(shù)除了可以在函數(shù)體中直接輸出數(shù)據(jù),還可以返回一個(gè)或多個(gè)值,稱為函數(shù)的返回值。在Python中,函數(shù)使用return語句返回值。return語句用于退出函數(shù)并將程序返回到函數(shù)調(diào)用的位置繼續(xù)執(zhí)行,同時(shí)返回零個(gè)、一個(gè)或多個(gè)值。任務(wù)一三、函數(shù)的返回值【例5-1】
小藍(lán)的日?;顒?dòng)?!締栴}分析】
定義函數(shù)封裝日常活動(dòng),然后按作息時(shí)間調(diào)用函數(shù)。例如,定義eat()函數(shù),
輸出“吃
飯......”,定義school()函數(shù)輸出“上課......”等。defeat(time): #定義eat()函數(shù),參數(shù)為時(shí)間time#如果time在6點(diǎn)~8點(diǎn),返回吃早飯iftime>=6andtime<=8:return'{}點(diǎn)吃早飯......'.format(time)#如果time在11點(diǎn)~13點(diǎn),返回吃午飯eliftime>=11andtime<=13:return'{}點(diǎn)吃午飯......'.format(time)#如果time在17點(diǎn)~19點(diǎn),返回吃晚飯eliftime>=17andtime<=19:return'{}點(diǎn)吃晚飯......'.format(time)else: #不滿足上述條件,返回不在吃飯時(shí)間return'不在吃飯時(shí)間'time=int(input('請輸入時(shí)間:'))
#輸入時(shí)間,并轉(zhuǎn)換為int型賦給timeprint(eat(time))
#調(diào)用eat()函數(shù),輸出返回值任務(wù)一【參考代碼】任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-2所示。圖5-2例5-2程序運(yùn)行結(jié)果
如果函數(shù)沒有return語句,將默認(rèn)以returnNone結(jié)束,即返回空值。函數(shù)也可以使用return語句返回多個(gè)值,每個(gè)值之間使用逗號隔開。函數(shù)調(diào)用后,返回值以元組形式保存。任務(wù)一【例5-3】
計(jì)算小藍(lán)的最低成績、最高成績和總成績。【問題分析】
定義函數(shù)score_compute(),參數(shù)為小藍(lán)的各科成績,使用min()函數(shù)計(jì)算最小值,max()函數(shù)計(jì)算最大值,然后返回最小值、最大值及總成績?!緟⒖即a】
#定義score_compute()函數(shù)defscore_compute(chinese,math,english):#使用min()函數(shù)計(jì)算最小值,并賦給score_minscore_min=min(chinese,math,english)#使用max()函數(shù)計(jì)算最大值,并賦給score_maxscore_max=max(chinese,math,english)#計(jì)算總成績,并賦給score_totalscore_total=chinese+math+english#返回score_min、score_max和score_totalreturnscore_min,score_max,score_total任務(wù)一【參考代碼】
#輸入各科成績chinese=float(input('請輸入語文成績:'))math=float(input('請輸入數(shù)學(xué)成績:'))english=float(input('請輸入英語成績:'))#調(diào)用score_compute()函數(shù),并將返回值賦給scorescore=score_compute(chinese,math,english)print(score,type(score)) #輸出score及其類型print('小藍(lán)的最低成績?yōu)椋?,score[0],'\n小藍(lán)的最高成績?yōu)椋?,score[1],'\n小藍(lán)的總成績?yōu)椋?,score[2])#輸出最低成績、最高成績和總成績?nèi)蝿?wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-3所示。圖5-3例5-3程序運(yùn)行結(jié)果【程序說明】本例題中return語句返回多個(gè)值,通過語句“print(score,type(score))”輸出變量score及其類型,可以看出,多個(gè)值以元組形式保存。因此,可以通過下標(biāo)來訪問元組中的元素,從而分別得到最低成績、最高成績和總成績。定義函數(shù)時(shí),圓括號內(nèi)的參數(shù)為形參;調(diào)用函數(shù)時(shí),圓括號內(nèi)的參數(shù)為實(shí)參,根據(jù)參數(shù)的不同數(shù)據(jù)類型,將實(shí)參的值或引用傳遞給形參。在Python中,函數(shù)參數(shù)的數(shù)據(jù)類型可分為不可變數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、字符串、元組等)和可變數(shù)據(jù)類型(如列表、字典、集合等)。當(dāng)參數(shù)的數(shù)據(jù)類型為不可變數(shù)據(jù)類型時(shí),在函數(shù)內(nèi)直接修改形參的值不會(huì)影響實(shí)參。任務(wù)一四、函數(shù)的參數(shù)函數(shù)的參數(shù)1.實(shí)參和形參任務(wù)一【例5-4】
閱讀下面程序,分析輸出結(jié)果?!緟⒖即a】
defchange(a):a=10print('函數(shù)內(nèi)a=',a)a=2change(a)print('函數(shù)外a=',a)任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-4所示。圖5-4例5-4程序運(yùn)行結(jié)果【程序說明】從運(yùn)行結(jié)果可以看出,在函數(shù)內(nèi)修改了形參a的值,但是當(dāng)函數(shù)運(yùn)行結(jié)束后,實(shí)參a的值并沒有改變。但當(dāng)參數(shù)的數(shù)據(jù)類型為可變數(shù)據(jù)類型時(shí),在函數(shù)內(nèi)使用下標(biāo)或其他方式增加、刪除或修改元素時(shí),實(shí)參也會(huì)相應(yīng)地修改。任務(wù)一【例5-5】
閱讀下面程序,分析輸出結(jié)果?!緟⒖即a】
defchange(mylist):mylist.append([1,2,3,4])print('函數(shù)內(nèi)mylist=',mylist)mylist=[10,20,30]print('調(diào)用函數(shù)前,函數(shù)外mylist=',mylist)change(mylist)print('調(diào)用函數(shù)后,函數(shù)外mylist=',mylist)任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-5所示。圖5-5例5-5程序運(yùn)行結(jié)果【程序說明】從運(yùn)行結(jié)果可以看出,在函數(shù)內(nèi)修改了形參mylist的元素,當(dāng)函數(shù)運(yùn)行結(jié)束后,實(shí)參mylist的值也修改了。defgreet(name,say):print(name,say)greet('小藍(lán)','你好!')greet('hello!','小舞')greet('小明')任務(wù)一2.參數(shù)類型
在Python中,函數(shù)有多種參數(shù)類型,包括位置參數(shù)、默認(rèn)值參數(shù)、關(guān)鍵字參數(shù)和不定長參數(shù)。
1)位置參數(shù)
位置參數(shù)是比較常用的形式,調(diào)用函數(shù)時(shí),實(shí)參和形參的順序應(yīng)一致,且實(shí)參和形參的數(shù)量必須相同。【例5-6】
定制問候語。對不同的人說不同的問候語。【問題分析】
定義函數(shù)greet(name,say),其中,name表示人名,say表示問候語。【參考代碼】
任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-6所示。圖5-6例5-6程序運(yùn)行結(jié)果【程序說明】當(dāng)?shù)谝淮握{(diào)用greet()函數(shù)時(shí),將實(shí)參“小藍(lán)”和“你好!”分別傳遞給形參name和say,實(shí)現(xiàn)輸出。當(dāng)?shù)诙握{(diào)用greet()函數(shù)時(shí),將實(shí)參“hello!”和“小舞”分別傳遞給形參name和say,雖然也可以正常輸出,但實(shí)參和形參的含義不一致,將會(huì)影響數(shù)據(jù)的理解和使用,因此,位置參數(shù)的實(shí)參和形參的順序須一致。當(dāng)?shù)谌握{(diào)用greet()函數(shù)時(shí),實(shí)參和形參的數(shù)量不同,程序運(yùn)行到該條語句時(shí)提示錯(cuò)誤信息(缺少要求的位置參數(shù)say)。
在定義函數(shù)時(shí),可以為函數(shù)的參數(shù)設(shè)置默認(rèn)值,此參數(shù)稱為默認(rèn)值參數(shù)。在調(diào)用帶默認(rèn)值參數(shù)的函數(shù)時(shí),可以不用為默認(rèn)值參數(shù)傳值,此時(shí)函數(shù)將會(huì)直接使用函數(shù)定義時(shí)設(shè)置的默認(rèn)值,也可以通過顯式賦值來替換其默認(rèn)值。定義帶有默認(rèn)值參數(shù)函數(shù)的基本語法格式如下。任務(wù)一2)默認(rèn)值參數(shù)def函數(shù)名(……,形參名=默認(rèn)值):函數(shù)體
在定義帶有默認(rèn)值參數(shù)的函數(shù)時(shí),默認(rèn)值參數(shù)必須出現(xiàn)在函數(shù)形參列表的最右端,否則會(huì)提示語法錯(cuò)誤。例如,下面函數(shù)的定義是錯(cuò)誤的。
deff(a=1,b,c=3):
print(a,b,c)
還可使用“函數(shù)名.__defaults__”查看函數(shù)所有默認(rèn)值參數(shù)的當(dāng)前值,其返回值為一個(gè)元組,其中的元素依次表示每個(gè)默認(rèn)值參數(shù)的當(dāng)前值。任務(wù)一任務(wù)一【例5-7】
使用不可變數(shù)據(jù)類型設(shè)置默認(rèn)問候語?!緟⒖即a】
defgreet(name,say='hi!'): #設(shè)置默認(rèn)問候語為“hi!”print(name,say)print(greet.__defaults__) #輸出函數(shù)默認(rèn)值參數(shù)greet('小藍(lán)','你好!')greet('小舞','hello!')greet('小紅')greet('小明')任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-7所示。圖5-7例5-7程序運(yùn)行結(jié)果【程序說明】多次調(diào)用函數(shù)且不為默認(rèn)值參數(shù)傳遞值時(shí),默認(rèn)值參數(shù)只在定義時(shí)進(jìn)行一次解釋和初始化,而對于列表、字典等可變數(shù)據(jù)類型的默認(rèn)值參數(shù),可能會(huì)導(dǎo)致邏輯錯(cuò)誤。因此,一般來說,要避免使用列表、字典、集合或其他可變數(shù)據(jù)類型作為函數(shù)參數(shù)的默認(rèn)值。任務(wù)一【例5-8】
使用可變數(shù)據(jù)類型設(shè)置默認(rèn)問候語?!緟⒖即a】
defgreet(name,say=['hi!']): #使用列表設(shè)置默認(rèn)問候語say.append('見到你很開心') #列表添加元素print(name,say)greet('小藍(lán)',['你好!'])greet('小舞',['hello!'])greet('小明')greet('小紅')任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-8所示。圖5-8例5-8程序運(yùn)行結(jié)果【程序說明】使用列表作為默認(rèn)值參數(shù),且連續(xù)多次調(diào)用該函數(shù)而不給該參數(shù)傳值時(shí),再次調(diào)用將保留上一次調(diào)用結(jié)果。因此,執(zhí)行語句“greet('小紅')”時(shí),輸出的列表say中包含兩個(gè)“見到你很開心”,即在上一次調(diào)用結(jié)果的基礎(chǔ)上增加了同一元素。
此外,如果在定義函數(shù)時(shí)某個(gè)參數(shù)的默認(rèn)值為一個(gè)變量,那么參數(shù)的默認(rèn)值只取決于函數(shù)定義時(shí)該變量的值。任務(wù)一【例5-9】
使用變量設(shè)置默認(rèn)問候語?!緟⒖即a】
s='hi!'defgreet(name,say=s):print(name,say)s='你好!'greet('小藍(lán)')任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-9所示。圖5-9例5-9程序運(yùn)行結(jié)果【程序說明】函數(shù)的默認(rèn)值參數(shù)只會(huì)初始化一次,即在函數(shù)定義時(shí)就確定值,所以,在定義函數(shù)greet()時(shí),s的值為“hi!”,因此輸出為“小藍(lán)hi!”。
關(guān)鍵字參數(shù)是指調(diào)用函數(shù)時(shí)按參數(shù)名傳遞值。使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與定義時(shí)不一致,Python解釋器能夠使用參數(shù)名匹配參數(shù)值。任務(wù)一3)關(guān)鍵字參數(shù)defgreet(name,say):print(name,say)greet('你好!','小藍(lán)')greet(say='hello!',name='小舞')【例5-3】
使用關(guān)鍵字參數(shù)設(shè)置問候語?!緟⒖即a】
任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-10所示。圖5-10例5-10程序運(yùn)行結(jié)果def函數(shù)名([形參列表,]*args,**kwargs):函數(shù)體
通常在定義一個(gè)函數(shù)時(shí),若希望函數(shù)能夠處理比定義時(shí)更多的參數(shù),此時(shí)可在函數(shù)中使用“*”或“**”符號表示不定長參數(shù),其基本語法格式如下。任務(wù)一4)不定長參數(shù)【例5-11】使用不定長參數(shù)同時(shí)和多人說問候語?!緟⒖即a】
任務(wù)一【參考代碼】
defgreet(say,*names,**name_say):print('say:',say)print('names:',names)print('name_say:',name_say)fornameinnames:print(name,say)forkeyinname_say.keys():print(key,name_say[key])greet('hi!','小藍(lán)','小舞',小紅='你好!',小明='hello!')任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-11所示。圖5-11例5-11程序運(yùn)行結(jié)果【程序說明】在調(diào)用greet()函數(shù)時(shí),傳入多個(gè)值,這些值會(huì)自左往右依次匹配函數(shù)定義時(shí)的參數(shù),首先將“hi!”傳遞給say,接著將“'小藍(lán)','小舞'”組成一個(gè)元組,傳遞給names,最后將“小紅='你好!',小明='hello!'”轉(zhuǎn)換為字典傳遞給name_say。
漢諾塔(TowerofHanoi)源于印度傳說,大梵天創(chuàng)造世界時(shí)造了3根金剛石柱子,其中一根柱子自底向上疊著從大到小的64個(gè)黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在3根柱子之間一次只能移動(dòng)一個(gè)圓盤。本任務(wù)將帶領(lǐng)大家編寫Python程序,使用遞歸函數(shù),解析漢諾塔問題。任務(wù)二解析漢諾塔問題任務(wù)描述任務(wù)實(shí)施完成本任務(wù),須首先定義4個(gè)函數(shù)分別實(shí)現(xiàn)兩個(gè)數(shù)的加法、減法、乘法和除法運(yùn)算,并輸出運(yùn)算結(jié)果;然后輸入兩個(gè)參與運(yùn)算的數(shù)和運(yùn)算符;最后根據(jù)運(yùn)算符調(diào)用相應(yīng)的函數(shù)。解析漢諾塔問題任
務(wù)
二任務(wù)二解析漢諾塔問題知識鏈接Python允許函數(shù)的嵌套定義,即在函數(shù)內(nèi)可以再定義另外一個(gè)函數(shù)。例如,在fun1()函數(shù)中嵌套定義fun2()函數(shù),可以用下面代碼實(shí)現(xiàn)。一、函數(shù)的嵌套deffun1(): #定義fun1()函數(shù)print('************')deffun2(): #嵌套定義fun2()函數(shù)print('Helloworld!')fun2() #調(diào)用fun2()函數(shù)fun1() #調(diào)用fun1()函數(shù)
這里需要注意的是,fun2()函數(shù)只在定義開始到fun1()函數(shù)結(jié)束范圍內(nèi)有效。
Python還允許在一個(gè)函數(shù)中調(diào)用另外一個(gè)函數(shù),這就是函數(shù)的嵌套調(diào)用。例如,上述代碼中,在fun1()函數(shù)中嵌套調(diào)用fun2()函數(shù)。當(dāng)然,函數(shù)也可以嵌套調(diào)用外部定義的另一個(gè)函數(shù)。任務(wù)二【例5-12】計(jì)算1!+2!+3!+…+10!的值并輸出?!締栴}分析】
使用函數(shù)的嵌套調(diào)用實(shí)現(xiàn),定義fac()函數(shù)計(jì)算階乘,以及sum()函數(shù)計(jì)算累加。執(zhí)行時(shí)首先調(diào)用sum()函數(shù),然后sum()函數(shù)中再調(diào)用fac()函數(shù)。任務(wù)二【參考代碼】
deffac(k): #定義fac()函數(shù),計(jì)算階乘i=2t=1whilei<=k:t*=ii+=1returnt #返回階乘結(jié)果defsum(n): #定義sum()函數(shù),計(jì)算累加s=0i=1whilei<=n:s=s+fac(i) #調(diào)用fac()函數(shù)i+=1returns
#返回累加結(jié)果print('1!+2!+3!…10!=',sum(10))
#調(diào)用sum()函數(shù)任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-13所示。圖5-13例5-13程序運(yùn)行結(jié)果任務(wù)二Python支持函數(shù)的遞歸調(diào)用,它是一種函數(shù)嵌套調(diào)用的特殊形式,即函數(shù)直接或間接地調(diào)用其本身。直接遞歸調(diào)用是在函數(shù)中調(diào)用自身,例如:二、函數(shù)的遞歸deffun(): #定義fun()函數(shù)fun() #調(diào)用fun()函數(shù)間接遞歸調(diào)用是在fun()函數(shù)中調(diào)用fun1()函數(shù),而fun1()函數(shù)又調(diào)用了fun()函數(shù),例如:deffun(): #定義fun()函數(shù)fun1() #調(diào)用fun1()函數(shù)deffun1(): #定義fun1()函數(shù)fun() #調(diào)用fun()函數(shù)
可以看出,這兩種遞歸調(diào)用都是無休止地調(diào)用自身。因此,為了防止無限遞歸,所有遞歸函數(shù)都需要設(shè)定終止條件。任務(wù)二【例5-13】計(jì)算斐波那契數(shù)列的第n項(xiàng)。斐波那契數(shù)列從第3項(xiàng)開始,元素的值為前兩個(gè)元素相加得到,如1、1、2、3、5、8、13、21、34、55?!締栴}分析】定義函數(shù)fib(n)計(jì)算數(shù)列的第n項(xiàng),由題可知fib(n)=fib(n-1)+fib(n-2),因此可使用遞歸函數(shù)解決該問題。任務(wù)二【參考代碼】
deffib(n):ifn==1:return1elifn==2:return1else:returnfib(n-1)+fib(n-2)n=int(input('請輸入一個(gè)正整數(shù):'))print('斐波那契數(shù)列的第{}項(xiàng)為:{}'.format(n,fib(n)))任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-14所示。圖5-14例5-14程序運(yùn)行結(jié)果【程序說明】本例題中,n=1和n=2時(shí)都返回1,這就是該函數(shù)的終止條件。當(dāng)n等于5時(shí),該程序的執(zhí)行過程如圖5-15所示。任務(wù)二圖5-15計(jì)算斐波那契數(shù)列第5項(xiàng)的執(zhí)行過程任務(wù)實(shí)施將漢諾塔問題抽象為數(shù)學(xué)問題。如圖所示,從左到右有A、B、C三根柱子,其中,A柱有從大到小的N個(gè)圓盤?,F(xiàn)要求將A柱的圓盤移到C柱,期間應(yīng)遵守一個(gè)規(guī)則:一次只能移動(dòng)一個(gè)圓盤,且大圓盤只能在小圓盤下面,求移動(dòng)的步驟和移動(dòng)的次數(shù)。制作東京奧運(yùn)會(huì)前5獎(jiǎng)牌榜任
務(wù)
四
東京奧運(yùn)會(huì)共產(chǎn)生了339塊金牌,中國代表隊(duì)取得了金牌數(shù)及獎(jiǎng)牌總數(shù)都排名第二的好成績。本任務(wù)將帶領(lǐng)大家編寫Python程序,使用全局變量和匿名函數(shù),制作東京奧運(yùn)會(huì)前5獎(jiǎng)牌榜。任務(wù)三制作東京奧運(yùn)會(huì)前5獎(jiǎng)牌榜任務(wù)描述
在東京奧運(yùn)會(huì)中,我國涌現(xiàn)了一批優(yōu)秀的
00
后運(yùn)動(dòng)員,如全紅嬋、李雯雯、孫穎莎、張常鴻等。他們努力拼搏、堅(jiān)持不懈、披荊斬棘、為國爭光,向全世界展示了“少年強(qiáng)則國強(qiáng)”的青春風(fēng)采。任務(wù)三青春風(fēng)采第32屆夏季奧林匹克運(yùn)動(dòng)會(huì),即2020年東京奧運(yùn)會(huì),是由日本奧林匹克委員會(huì)舉辦的國際性運(yùn)動(dòng)會(huì),因新冠疫情影響,推遲于2021年7月23日開幕、8月8日閉幕。東京奧運(yùn)會(huì)共有204個(gè)國家和地區(qū),以及俄羅斯奧運(yùn)隊(duì)和奧林匹克難民代表團(tuán)參賽,共11669名參賽運(yùn)動(dòng)員;賽事項(xiàng)目共設(shè)有33個(gè)大項(xiàng)、339個(gè)小項(xiàng),包括滑板、沖浪、競技攀巖、棒壘球和空手道5個(gè)新增項(xiàng)目。任務(wù)三知識鏈接一、局部變量和全局變量當(dāng)一個(gè)程序中包含多個(gè)函數(shù)時(shí),可在各函數(shù)中分別定義變量。根據(jù)變量作用域的不同,可將變量分為局部變量和全局變量兩種類型。局部變量是定義在函數(shù)內(nèi)的變量,只能在變量定義開始到函數(shù)結(jié)束的范圍內(nèi)使用,它與函數(shù)外
具有相同名稱的其他變量沒有任何關(guān)系。不同函數(shù)中,可以使用相同名稱的局部變量,它們代表不同的對象,互不干擾。此外,函數(shù)的形參也屬于局部變量,作用范圍僅限于函數(shù)內(nèi)部。
在函數(shù)外定義的變量稱為全局變量,它在變量定義開始到整個(gè)程序結(jié)束的范圍內(nèi)有效。任務(wù)三【例5-14】
分析下面程序的運(yùn)行結(jié)果。【參考代碼】
num=3 #創(chuàng)建全局變量numdeffun(): #定義fun()函數(shù)num=5 #創(chuàng)建局部變量numprint('函數(shù)內(nèi)局部變量num的值:',num) #輸出局部變量num的值fun() #調(diào)用fun()函數(shù)print('函數(shù)外全局變量num的值:',num) #輸出全局變量num的值任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-19所示。圖5-19例5-19程序運(yùn)行結(jié)果【程序說明】在此程序中,定義了兩個(gè)名為num的變量。在函數(shù)內(nèi)的num變量為局部變量,調(diào)用函數(shù)后num的值為5,故函數(shù)內(nèi)的輸出為5;離開函數(shù)后,在函數(shù)內(nèi)定義的num變量失效,此時(shí)全局變量num有效,故函數(shù)外的輸出為3。任務(wù)三二、global和nonlocal關(guān)鍵字當(dāng)內(nèi)部作用域想要使用或修改外部作用域的變量時(shí),可使用global和nonlocal關(guān)鍵字聲明該變量,但聲明時(shí)不能賦值。1.global關(guān)鍵字使用global關(guān)鍵字可分為以下兩種情況。(1)變量已在函數(shù)外創(chuàng)建,如果需要在函數(shù)內(nèi)使用或修改該變量,須在函數(shù)內(nèi)使用關(guān)鍵字global聲明該全局變量。(2)變量沒有在函數(shù)外創(chuàng)建,在函數(shù)內(nèi)直接使用global關(guān)鍵字聲明全局變量,然后賦值,調(diào)用該函數(shù)后,會(huì)創(chuàng)建新的全局變量,在函數(shù)外也可以使用或修改該變量。
任務(wù)三【例5-15】
分析下面程序的運(yùn)行結(jié)果?!緟⒖即a】
num=5 #創(chuàng)建全局變量numdeffun(): #定義fun()函數(shù)globalnum #使用global關(guān)鍵字聲明numnum+=1 #num加1print('函數(shù)內(nèi)num的值:',num) #函數(shù)內(nèi)輸出num的值fun() #調(diào)用fun()函數(shù)print('函數(shù)外num的值:',num)
#函數(shù)外輸出num的值任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-20所示。圖5-20例5-20程序運(yùn)行結(jié)果【程序說明】在fun()函數(shù)外創(chuàng)建全局變量num,然后在fun()函數(shù)內(nèi)使用global關(guān)鍵字聲明num,此時(shí),函數(shù)內(nèi)的num就是函數(shù)外的全局變量num。因此,在函數(shù)內(nèi)num的初始值為5,執(zhí)行“num+=1”語句后,num的值為6,函數(shù)外的num值也為6。任務(wù)三
如果沒有“globalnum”這條語句,函數(shù)內(nèi)的num為局部變量,執(zhí)行“num+=1”這條語句前須對num賦值,否則,執(zhí)行程序時(shí)將提示“l(fā)ocalvariable'num'referencedbeforeassignment”錯(cuò)誤信息,即“在賦值前引用了局部變量num”,如圖5-21所示。圖5-21
錯(cuò)誤信息任務(wù)三2.nonlocal關(guān)鍵字
如果要在一個(gè)嵌套的函數(shù)內(nèi)使用或修改嵌套外部作用域中的變量,須使用nonlocal關(guān)鍵字修飾該變量?!纠?-16】
分析下面程序的運(yùn)行結(jié)果?!緟⒖即a】
defouter():num=1definner():nonlocalnum #nonlocal關(guān)鍵字聲明變量num=2print('inner函數(shù)中num的值:',num)inner()print('outer函數(shù)中num的值:',num)outer()任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-22所示。圖5-22例5-22程序運(yùn)行結(jié)果【程序說明】在inner()函數(shù)中使用了nonlocal關(guān)鍵字聲明num,即inner()函數(shù)中的num就是outer()函數(shù)中的num。因此,將num修改為2后,inner()函數(shù)和outer()函數(shù)中的輸出都是2。
如果沒有“nonlocalnum”這條語句,那么在inner()函數(shù)中的num就是局部變量,其值為2,在outer()函數(shù)中的num值為1,運(yùn)行結(jié)果如圖5-23所示。任務(wù)三三、匿名函數(shù)關(guān)鍵字lambda用于定義一種特殊的函數(shù)——匿名函數(shù),又稱lambda函數(shù)。匿名函數(shù)并非沒有名字,而是將函數(shù)名作為函數(shù)結(jié)果返回,其基本語法格式如下。圖5-23沒有“nonlocalnum”語句的運(yùn)行結(jié)果函數(shù)名=lambda[參數(shù)列表]:表達(dá)式
簡單地說,lambda函數(shù)用于定義簡單的、能夠在一行內(nèi)表示的函數(shù),返回一個(gè)函數(shù)名。例如:任務(wù)三
lambda函數(shù)常用在臨時(shí)需要一個(gè)類似于函數(shù)的功能,但又不想定義函數(shù)的場合。例如,作為內(nèi)置函數(shù)sorted()和列表方法sort()的key參數(shù)?!纠?-17】將學(xué)生信息(包括學(xué)號、姓名和成績)按成績升序排序后輸出?!締栴}分析】首先使用字典存儲(chǔ)每個(gè)學(xué)生的信息,再用列表存儲(chǔ)多個(gè)學(xué)生信息。然后使用sort()方法對列表按學(xué)生成績進(jìn)行升序排序,并使用lambda函數(shù)作為參數(shù)key的值。#定義lambda函數(shù),用于計(jì)算兩個(gè)數(shù)的和,并將函數(shù)名賦給sumsum=lambdaarg1,arg2:arg1+arg2#調(diào)用sum()函數(shù),輸出返回值結(jié)果為30print('兩數(shù)相加后的值為:',sum(10,20))任務(wù)三【參考代碼】
#定義學(xué)生信息列表,元素為字典stu=[{'num':'201801','name':'王五','score':89},{'num':'201802','name':'劉軍','score':95},{'num':'201803','name':'李夢','score':85}]stu.sort(key=lambdax:x['score']) #按成績升序排序forsinstu:#輸出列表中的元素print('學(xué)號:',s['num'],'姓名:',s['name'],'成績:',s['score'])任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-24所示。圖5-22例5-24程序運(yùn)行結(jié)果任務(wù)實(shí)施完成本任務(wù),可首先定義列表medal保存東京奧運(yùn)會(huì)獎(jiǎng)牌數(shù)前5的國家或運(yùn)動(dòng)隊(duì)的獎(jiǎng)牌數(shù),列表元素為字典類型,以國家名或運(yùn)動(dòng)隊(duì)名為鍵,以獎(jiǎng)牌數(shù)的字典為值;然后定義函數(shù)ranking(base)(base為金牌數(shù)或獎(jiǎng)牌總數(shù),表示排序依據(jù)),在其中使用sort()方法對medal進(jìn)行降序排序,并使用lambda函數(shù)作為參數(shù)key的值,遍歷列表,輸出排名和獎(jiǎng)牌數(shù);最后分別使用“金牌”和“總數(shù)”作為參數(shù)兩次調(diào)用ranking()函數(shù)。繪制奧運(yùn)五環(huán)標(biāo)志任
務(wù)
四
turtle庫是Python中一個(gè)很流行的標(biāo)準(zhǔn)庫,它用于繪制各種平面圖形。turtle又稱作海龜,可以把它想象成一只小海龜在畫布上游走,走過的軌跡即是繪制的圖形。本任務(wù)將帶領(lǐng)大家編寫Python程序,利用turtle庫繪制奧運(yùn)五環(huán)。任務(wù)四繪制奧運(yùn)五環(huán)標(biāo)志任務(wù)描述
共
同
家
園奧林匹克五環(huán)標(biāo)志由5個(gè)奧林匹克環(huán)套接組成,分別為藍(lán)、黑、紅、黃、綠5種顏色。環(huán)從左到右互相套接,上面是藍(lán)、黑、紅環(huán),下面是黃、綠環(huán)。5個(gè)不同顏色的圓環(huán)代表了參加現(xiàn)代奧林匹克運(yùn)動(dòng)會(huì)的五大洲——?dú)W洲、亞洲、非洲、大洋洲和美洲。根據(jù)奧林匹克憲章,五環(huán)象征五大洲的團(tuán)結(jié)及全世界的運(yùn)動(dòng)員以公正、坦率的比賽和友好的精神在奧林匹克運(yùn)動(dòng)會(huì)上相見。任務(wù)四知識鏈接一、模塊的導(dǎo)入有時(shí)要調(diào)用某個(gè)函數(shù)時(shí),必須導(dǎo)入模塊。在Python中,可使用import關(guān)鍵字來導(dǎo)入某個(gè)模塊。導(dǎo)入模塊的方法有以下3種。1.導(dǎo)入整個(gè)模塊使用import關(guān)鍵字導(dǎo)入整個(gè)模塊的基本語法格式如下。
import模塊名[as別名]
使用這種方式導(dǎo)入模塊后,調(diào)用模塊中的函數(shù)時(shí)須在函數(shù)名前加上模塊名作為前綴,其語法格式如下。任務(wù)四
模塊名.函數(shù)名因?yàn)樵诙鄠€(gè)模塊中,可能存在名稱相同的函數(shù),此時(shí)如果只通過函數(shù)名來進(jìn)行調(diào)用,解釋器將無法知道到底要調(diào)用哪個(gè)函數(shù)。例如:importmath #導(dǎo)入math模塊print(math.sqrt(4)) #輸出4的開方,結(jié)果為2.0當(dāng)模塊名很長時(shí),可為導(dǎo)入的模塊設(shè)置別名,然后使用“別名.函數(shù)名”的方式調(diào)用函數(shù)。例如:importrandomasr #導(dǎo)入random模塊,并設(shè)置別名為rprint(r.randint(1,100)) #輸出1~100的隨機(jī)整數(shù),結(jié)果可能為20任務(wù)四2.導(dǎo)入特定的函數(shù)當(dāng)只需用到模塊中的某個(gè)函數(shù)時(shí),可只導(dǎo)入特定的函數(shù),其基本語法格式如下。
from模塊名import函數(shù)名[as別名]
使用這種方式僅導(dǎo)入明確指定的函數(shù),并且可以為導(dǎo)入的函數(shù)設(shè)置別名。這種導(dǎo)入方式可以減少查詢次數(shù),提高訪問速度,同時(shí)也可以減少代碼量。在調(diào)用函數(shù)時(shí),不需要使用模塊名作為前綴。例如:
frommathimportsqrt #只導(dǎo)入math中的指定函數(shù)sqrt()print(sqrt(9))
#輸出9的開方,結(jié)果為3.0fromrandomimportrandintasr#導(dǎo)入randint()函數(shù)并設(shè)置別名為rprint(r(1,10))
#輸出1~10的隨機(jī)整數(shù),結(jié)果可能為7任務(wù)四3.導(dǎo)入模塊中所有內(nèi)容使用“*”符號可導(dǎo)入模塊中的所有內(nèi)容(包括函數(shù)和常量等),其基本語法格式如下。
from模塊名import*
例如:
frommathimport* #導(dǎo)入math模塊中的所有內(nèi)容print(pi) #輸出常數(shù)π,結(jié)果為3.141592653589793print(log2(8)) #計(jì)算并輸出以2為底的對數(shù)值,結(jié)果為3.0print(sqrt(16)) #計(jì)算并輸出16的開方,結(jié)果為4.0
這種方式可以直接使用模塊中的所有函數(shù)而不需要再使用模塊名作為前綴。但一般并不推薦這樣使用,因?yàn)檫@樣做會(huì)降低代碼的可讀性,同時(shí)會(huì)導(dǎo)致命名空間的混亂。任務(wù)四二、模塊的創(chuàng)建
每個(gè)Python文件都可以作為一個(gè)模塊,模塊名就是文件名。例如,現(xiàn)有一個(gè)文件“add.py”,其中定義了添加學(xué)生信息的函數(shù)addStuInfo(),代碼如下。
#添加一個(gè)學(xué)生信息defaddStuInfo(stuInfos):num=input('請輸入新學(xué)生的學(xué)號:') #提示并獲取學(xué)生的學(xué)號name=input('請輸入新學(xué)生的姓名:') #提示并獲取學(xué)生的姓名sex=input('請輸入新學(xué)生的性別(男/女):') #提示并獲取學(xué)生的性別newInfo={}
#定義字典#將學(xué)生信息保存在字典中newInfo['num']=numnewInfo['name']=namenewInfo['sex']=sexstuInfos.append(newInfo) #將字典添加到列表中任務(wù)四【例5-18】
調(diào)用上述add模塊中的addStuInfo()函數(shù),添加3個(gè)學(xué)生信息并輸出?!緟⒖即a】
importadd #導(dǎo)入add模塊stuInfos=[] #創(chuàng)建空列表foriinrange(3): #循環(huán)3次add.addStuInfo(stuInfos)
#調(diào)用addStuInfo()函數(shù),添加學(xué)生信息forinfoinstuInfos: #遍歷列表print(info) #輸出列表的元素任務(wù)四【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖5-26所示。圖5-26例5-26程序運(yùn)行結(jié)果任務(wù)四三、__name__屬性在實(shí)際開發(fā)過程中,開發(fā)人員為了測試模塊的效果,會(huì)自行在模塊中添加測試信息。例如,在“add.py”文件中添加測試代碼如下。
#添加一個(gè)學(xué)生信息defaddStuInfo(stuInfos):num=input('請輸入新學(xué)生的學(xué)號:')
#提示并獲取學(xué)生的學(xué)號name=input('請輸入新學(xué)生的姓名:') #提示并獲取學(xué)生的姓名sex=input('請輸入新學(xué)生的性別(男/女):') #提示并獲取學(xué)生的性別newInfo={} #定義字典#將學(xué)生信息保存在字典中newInfo['num']=numnewInfo['name']=namenewInfo['sex']=sexstuInfos.append(newInfo)
#將字典添加到列表中#測試代碼stuInfos=[] #創(chuàng)建空列表addStuInfo(stuInfos) #調(diào)用addStuInfo()函數(shù)print('測試信息',stuInfos) #輸出測試信息任務(wù)四此時(shí),如果在其他程序中導(dǎo)入此模塊,測試代碼會(huì)在導(dǎo)入時(shí)自動(dòng)運(yùn)行。重新運(yùn)行例5-18程序,運(yùn)行結(jié)果如圖5-27所示。
圖5-27“add.py”文件中添加測試代碼后例5-18程序運(yùn)行結(jié)果任務(wù)四【程序說明】從上述結(jié)果可以看出,“add.py”中的測試代碼也運(yùn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鹽城師范學(xué)院《體育概述》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年化學(xué)單質(zhì):碳項(xiàng)目發(fā)展計(jì)劃
- 年產(chǎn)50000套護(hù)理床、助行器擴(kuò)建拋丸項(xiàng)目環(huán)評報(bào)告表
- 儀器設(shè)備租賃合同(2024年版)
- 2024年污水自動(dòng)采樣器項(xiàng)目合作計(jì)劃書
- 2024計(jì)件勞動(dòng)合同范本
- 2024年魚、蝦、貝、藻類多倍體項(xiàng)目發(fā)展計(jì)劃
- 深圳聯(lián)通數(shù)據(jù)治理合法合規(guī)考試
- 工業(yè)園區(qū)建設(shè)管理協(xié)議(2024年版)
- 新高考語文一輪復(fù)習(xí)古詩文默寫+閱讀闖關(guān)練習(xí)第14篇《禮運(yùn)》(解析版)
- 2024新版英語英語3500個(gè)單詞分類大全
- 2024至2030年中國軟件和信息技術(shù)服務(wù)產(chǎn)業(yè)全景調(diào)查及投資咨詢報(bào)告
- 住宅小區(qū)物業(yè)快遞柜合作合同2024年
- 1《百合花》第一課公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)統(tǒng)編版高中語文必修上冊
- 2024年山西省中考思想品德試卷及答案
- 新課標(biāo)下的語文教學(xué):五上《中國民間故事》表現(xiàn)性任務(wù)設(shè)計(jì)
- 2024至2030年成都市酒店市場前景調(diào)查及投資策略分析報(bào)告
- Python第三課-重復(fù)與循環(huán)(教學(xué)設(shè)計(jì))
- 2024新蘇教版一年級數(shù)學(xué)上冊全冊教材分析
- 部編版道德與法治一年級上冊全冊課件
- 人教版新目標(biāo)英語八年級下冊《The Present Perfect Tense(復(fù)習(xí)現(xiàn)在完成時(shí)) Section A 》說課稿4
評論
0/150
提交評論