




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章程序控制結(jié)構(gòu)董付國(guó)微信公眾號(hào):Python小屋本章學(xué)習(xí)目標(biāo)理解條件表達(dá)式的值與True/False的等價(jià)關(guān)系熟練掌握選擇結(jié)構(gòu)的語(yǔ)法和應(yīng)用熟練掌握f(shuō)or和while循環(huán)結(jié)構(gòu)的語(yǔ)法和應(yīng)用熟練掌握break和continue語(yǔ)句的作用與應(yīng)用熟練掌握異常處理結(jié)構(gòu)的語(yǔ)法和應(yīng)用熟練掌握選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、異常處理結(jié)構(gòu)嵌套使用的語(yǔ)法和應(yīng)用養(yǎng)成對(duì)用戶輸入進(jìn)行有效性檢查的習(xí)慣3.1條件表達(dá)式在選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中,都要根據(jù)條件表達(dá)式的值來(lái)確定下一步的執(zhí)行流程。選擇結(jié)構(gòu)根據(jù)不同的條件是否滿足來(lái)決定要不要執(zhí)行特定的代碼,循環(huán)結(jié)構(gòu)根據(jù)條件是否成立來(lái)決定要不要重復(fù)執(zhí)行特定的代碼。在Python中,幾乎所有合法表達(dá)式都可以作為條件表達(dá)式,包括單個(gè)常量或變量,以及使用各種運(yùn)算符和函數(shù)調(diào)用連接起來(lái)的表達(dá)式。條件表達(dá)式的值等價(jià)于True時(shí)表示條件成立,等價(jià)于False時(shí)表示條件不成立。一個(gè)值等價(jià)于True是指,這個(gè)值作為內(nèi)置函數(shù)bool()的參數(shù)會(huì)使得該函數(shù)返回True。3.2選擇結(jié)構(gòu)如果細(xì)分的話,程序控制結(jié)構(gòu)包括順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和異常處理結(jié)構(gòu)。在正常情況下,程序中的代碼是從上往下逐條語(yǔ)句執(zhí)行的,也就是按先后順序執(zhí)行程序中的每行代碼。如果程序中有選擇結(jié)構(gòu),可以根據(jù)不同的條件來(lái)決定執(zhí)行哪些代碼和不執(zhí)行哪些代碼。如果程序中有循環(huán)結(jié)構(gòu),可以根據(jù)相應(yīng)的條件是否滿足來(lái)決定需要多次重復(fù)執(zhí)行哪些代碼。如果有異常處理結(jié)構(gòu),可以根據(jù)是否發(fā)生錯(cuò)誤以及錯(cuò)誤的類(lèi)型來(lái)決定應(yīng)該如何處理。選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、異常處理結(jié)構(gòu)都是臨時(shí)改變程序流程的方式。從宏觀上講,如果把每個(gè)選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)或異常處理結(jié)構(gòu)的多行代碼看作一個(gè)大的語(yǔ)句塊,整個(gè)程序仍是順序執(zhí)行的。從微觀上講,選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、異常處理結(jié)構(gòu)內(nèi)部語(yǔ)句塊中的多行簡(jiǎn)單語(yǔ)句之間仍是順序結(jié)構(gòu)。3.2.1單分支選擇結(jié)構(gòu)if條件表達(dá)式:語(yǔ)句塊前面的代碼條件成立?語(yǔ)句塊后面的代碼是否3.2.1單分支選擇結(jié)構(gòu)例3-1程序員小明的妻子打電話讓小明下班路上買(mǎi)飯回來(lái),和小明說(shuō)“回來(lái)路上買(mǎi)10個(gè)包子,如果看到旁邊有賣(mài)西瓜的就買(mǎi)一個(gè)”。結(jié)果,小明回到家后妻子發(fā)現(xiàn)他只買(mǎi)了一個(gè)包子,問(wèn)他怎么回事,小明說(shuō)“我看到旁邊有賣(mài)西瓜的”。編寫(xiě)程序模擬小明的腦回路。#要買(mǎi)的包子數(shù)量num=10flag=input('有賣(mài)西瓜的嗎?輸入Y/N:')ifflag=='Y':num=1print(f'實(shí)際買(mǎi)的包子數(shù)量為:{num}')3.2.2雙分支選擇結(jié)構(gòu)if條件表達(dá)式:語(yǔ)句塊1else:語(yǔ)句塊2前面的代碼條件成立?語(yǔ)句塊2后面的代碼是否語(yǔ)句塊13.2.2雙分支選擇結(jié)構(gòu)例3-2周五晚上放學(xué)時(shí),小明和小強(qiáng)兩位同學(xué)相約周六的安排,說(shuō)好如果不下雨就一起打羽毛球,如果下雨就一起寫(xiě)作業(yè)。周六早上,兩個(gè)人根據(jù)是否下雨來(lái)決定最終要做的事情。編寫(xiě)程序,輸入Y表示下雨、N表示不下雨,模擬二人做決定的過(guò)程,并輸出二人的最終決定。flag=input('今天下雨嗎?輸入Y/N:')ifflag=='Y':print('一起寫(xiě)作業(yè)。')else:print('一起打羽毛球。')3.2.3嵌套的選擇結(jié)構(gòu)if條件表達(dá)式1:語(yǔ)句塊1elif條件表達(dá)式2:語(yǔ)句塊2[elif條件表達(dá)式3:語(yǔ)句塊3......else:語(yǔ)句塊n]if條件表達(dá)式1:語(yǔ)句塊1if條件表達(dá)式2:語(yǔ)句塊2[else:語(yǔ)句塊3]else:if條件表達(dá)式4:語(yǔ)句塊4[elif條件表達(dá)式5:語(yǔ)句塊5else:語(yǔ)句塊6]3.2.3嵌套的選擇結(jié)構(gòu)例3-3對(duì)學(xué)生作業(yè)或考試進(jìn)行打分時(shí),一般有百分制和字母等級(jí)兩種方式。這兩種打分標(biāo)準(zhǔn)之間有一定的對(duì)應(yīng)關(guān)系,例如[90,100]區(qū)間對(duì)應(yīng)字母A,[80,90)區(qū)間對(duì)應(yīng)字母B,[70,80)區(qū)間對(duì)應(yīng)字母C,[60,70)區(qū)間對(duì)應(yīng)字母D,[0,60)區(qū)間對(duì)應(yīng)字母F。編寫(xiě)程序,輸入一個(gè)百分制成績(jī),輸出對(duì)應(yīng)的字母等級(jí)。3.2.3嵌套的選擇結(jié)構(gòu)score=float(input('請(qǐng)輸入一個(gè)百分制成績(jī):'))ifscore<0orscore>100:print('無(wú)效成績(jī)')else:#如果score本來(lái)的值是實(shí)數(shù),例如81.5#整除10之后得到8.0形式的數(shù)字,不影響后續(xù)的計(jì)算score=score//10ifscorein(9,10):print('A')elifscore==8:print('B')elifscore==7:print('C')elifscore==6:print('D')else:print('F')3.2.4多分支選擇結(jié)構(gòu)在Python3.9之前的版本中,沒(méi)有提供真正意義上的的多分支選擇結(jié)構(gòu),如果確實(shí)需要的話,可以通過(guò)字典構(gòu)造跳轉(zhuǎn)表來(lái)實(shí)現(xiàn)。例如下面的代碼,status={200:'ok',201:'Created',202:'Accepted',203:'Non-AuthoritativeInformation',204:'NoContent'}s=int(input('請(qǐng)輸入狀態(tài)碼:'))print('對(duì)應(yīng)的狀態(tài)為:',status.get(s,'unknown'))Python3.10新增了軟關(guān)鍵字(只在特定場(chǎng)合作為關(guān)鍵字,普通場(chǎng)合也可以作變量名)match和case,實(shí)現(xiàn)了真正意義上的多分支選擇結(jié)構(gòu)。3.2.4多分支選擇結(jié)構(gòu)例3-4編寫(xiě)程序,使用多分支選擇結(jié)構(gòu)實(shí)現(xiàn)HTTP狀態(tài)碼到含義的轉(zhuǎn)換。code=int(input('請(qǐng)輸入HTTP狀態(tài)碼:'))matchcode:case200:print('ok')case201:print('Created')case202:print('Accepted')case203:print('Non-AuthoritativeInformation')case204:print('NoContent')case401|403|404:#同時(shí)匹配401、403、404這三種情況print('Notallowed')case_:#通配符,表示任意內(nèi)容,如果前面的都不匹配,就執(zhí)行這里的代碼print('Sorry,pleasetrylater.')3.2.4多分支選擇結(jié)構(gòu)下面的代碼演示了下畫(huà)線在元組中表示任意內(nèi)容的用法:while(point:=input('表示三維空間坐標(biāo)的元組,0表示結(jié)束:'))!='0':point=eval(point)matchpoint:case(0,0,0):print('坐標(biāo)原點(diǎn)')case(0,_,_):print('YOZ平面上的點(diǎn)')case(_,0,_):print('XOZ平面上的點(diǎn)')case(_,_,0):print('XOY平面上的點(diǎn)')3.2.4多分支選擇結(jié)構(gòu)在match...case...多分支選擇結(jié)構(gòu)中,下畫(huà)線除了上面的用法之外,還可以和星號(hào)組合使用,例如下面的代碼中“*_”表示從當(dāng)前位置往后還有0到任意多項(xiàng):while(content:=eval(input('請(qǐng)輸入列表:')))!=0:matchcontent:case[1,2,3,4,*_]:print('前4項(xiàng)匹配成功')case[1,2,3,*_]:print('前3項(xiàng)匹配成功')case[1,2,*_]:print('前2項(xiàng)匹配成功')case[1,*_]:print('前1項(xiàng)匹配成功')case[*_]:print('匹配失敗')case_:print('格式不對(duì)')3.2.4多分支選擇結(jié)構(gòu)在下面的代碼中,使用if對(duì)當(dāng)前匹配項(xiàng)進(jìn)行約束,如果條件不成立就繼續(xù)檢查下一項(xiàng)是否匹配,其中的x和y可以是任意變量名。match(3,5):case(x,y)ifx<y:print('<')case(x,y)ifx==y:print('==')case(x,y)ifx>y:print('>')3.3循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)根據(jù)指定的條件是否滿足來(lái)決定是否需要重復(fù)執(zhí)行特定的代碼,Python中主要有for循環(huán)和while循環(huán)兩種形式。循環(huán)結(jié)構(gòu)可以嵌套,也可以和選擇結(jié)構(gòu)以及異常處理結(jié)構(gòu)互相嵌套,來(lái)表示更加復(fù)雜的業(yè)務(wù)邏輯。如果使用嵌套循環(huán)結(jié)構(gòu)的話,最外層的循環(huán)變化最慢,越內(nèi)層的循環(huán)變化速度越快。3.3.1for循環(huán)結(jié)構(gòu)Python語(yǔ)言中的for循環(huán)非常適合用來(lái)遍歷可迭代對(duì)象中的元素,語(yǔ)法形式為:for循環(huán)變量in可迭代對(duì)象:循環(huán)體[else:else子句代碼塊]其中,方括號(hào)內(nèi)的else子句可以沒(méi)有,也可以有,根據(jù)要解決的問(wèn)題來(lái)確定。for循環(huán)結(jié)構(gòu)執(zhí)行過(guò)程為:對(duì)于可迭代對(duì)象中的每個(gè)元素(使用循環(huán)變量引用),都執(zhí)行一次循環(huán)體中的代碼。在循環(huán)體中可以使用循環(huán)變量,也可以不使用循環(huán)變量。3.3.1for循環(huán)結(jié)構(gòu)如果for循環(huán)結(jié)構(gòu)帶有else子句,其執(zhí)行過(guò)程為:如果循環(huán)因?yàn)楸闅v完可迭代對(duì)象中的全部元素而自然結(jié)束,則繼續(xù)執(zhí)行else結(jié)構(gòu)中的語(yǔ)句,如果是因?yàn)閳?zhí)行了break語(yǔ)句提前結(jié)束循環(huán)則不會(huì)執(zhí)行else中的語(yǔ)句。在for循環(huán)結(jié)構(gòu)中定義的循環(huán)變量在循環(huán)結(jié)構(gòu)結(jié)束之后仍可以訪問(wèn),只要不超出當(dāng)前函數(shù)或文件即可;交互模式中for循環(huán)定義的循環(huán)變量在重啟Shell之前一直有效。3.3.2while循環(huán)結(jié)構(gòu)Python語(yǔ)言中的while循環(huán)結(jié)構(gòu)主要適用于無(wú)法提前確定循環(huán)次數(shù)的場(chǎng)合,一般不用于循環(huán)次數(shù)可以確定的場(chǎng)合,雖然也可以這樣用。While循環(huán)結(jié)構(gòu)的語(yǔ)法形式如下:while條件表達(dá)式:循環(huán)體[else:else子句代碼塊]其中,方括號(hào)內(nèi)的else子句可以沒(méi)有,也可以有,取決于具體要解決的問(wèn)題。當(dāng)條件表達(dá)式的值等價(jià)于True時(shí)就一直執(zhí)行循環(huán)體,直到條件表達(dá)式的值等價(jià)于False或者循環(huán)體中執(zhí)行了break語(yǔ)句。如果是因?yàn)闂l件表達(dá)式不成立而結(jié)束循環(huán),就繼續(xù)執(zhí)行else中的代碼塊。如果是因?yàn)檠h(huán)體內(nèi)執(zhí)行了break語(yǔ)句使得循環(huán)提前結(jié)束,則不再執(zhí)行else中的代碼塊。3.3.2while循環(huán)結(jié)構(gòu)例3-5小明買(mǎi)回來(lái)一對(duì)兔子,從第3個(gè)月開(kāi)始就每個(gè)月生一對(duì)兔子,生的每一對(duì)兔子長(zhǎng)到第3個(gè)月也開(kāi)始每個(gè)月都生一對(duì)兔子,每一對(duì)兔子都是這樣從第3個(gè)月開(kāi)始每個(gè)月生一對(duì)兔子,那么每個(gè)月小明家的兔子總數(shù)構(gòu)成一個(gè)數(shù)列,這就是著名的斐波那契數(shù)列,如圖3-3所示。編寫(xiě)程序,輸入一個(gè)正整數(shù),輸出斐波那契數(shù)列中小于該整數(shù)的所有整數(shù)。3.3.2while循環(huán)結(jié)構(gòu)number=int(input('請(qǐng)輸入一個(gè)正整數(shù):'))#序列解包,同時(shí)為多個(gè)變量賦值a,b=1,1whilea<number:print(a,end='')#序列解包a,b=b,a+b連續(xù)三次運(yùn)行結(jié)果如下:請(qǐng)輸入一個(gè)正整數(shù):10001123581321345589144233377610987請(qǐng)輸入一個(gè)正整數(shù):3500112358132134558914423337761098715972584請(qǐng)輸入一個(gè)正整數(shù):10000112358132134558914423337761098715972584418167653.3.3break與continue語(yǔ)句break語(yǔ)句和continue語(yǔ)句在while循環(huán)和for循環(huán)中都可以使用,并且一般常與選擇結(jié)構(gòu)或異常處理結(jié)構(gòu)結(jié)合使用,但不能在循環(huán)結(jié)構(gòu)之外使用這兩個(gè)語(yǔ)句。一旦break語(yǔ)句被執(zhí)行,將使得break語(yǔ)句所屬層次的循環(huán)結(jié)構(gòu)提前結(jié)束;如果break語(yǔ)句所在的循環(huán)帶有else子句,那么執(zhí)行break之后不會(huì)執(zhí)行else子句中的代碼。continue語(yǔ)句的作用是提前結(jié)束本次循環(huán),忽略continue之后的所有語(yǔ)句,提前進(jìn)入下一次循環(huán)。3.3.3break與continue語(yǔ)句例3-6編寫(xiě)程序,輸出500以內(nèi)最大的素?cái)?shù)(即499)。所謂素?cái)?shù),是指除了1和自身之外沒(méi)有其他因數(shù)的正整數(shù),最小的素?cái)?shù)是2??梢宰C明,如果一個(gè)正整數(shù)n是素?cái)?shù),那么從2到n的平方根之間必然沒(méi)有因數(shù)。forninrange(500,1,-1):
#從大到小遍歷ifn%2==0andn!=2:continueforiinrange(3,int(n**0.5)+1,2):ifn%i==0:#如果有n的因數(shù),n就不是素?cái)?shù)break#提前結(jié)束內(nèi)循環(huán)else:#如果內(nèi)循環(huán)自然結(jié)束,繼續(xù)執(zhí)行這里的代碼print(n)#輸出素?cái)?shù)break#結(jié)束外循環(huán)3.3.4循環(huán)結(jié)構(gòu)優(yōu)化編寫(xiě)程序?qū)崿F(xiàn)預(yù)定功能之后應(yīng)考慮對(duì)代碼進(jìn)行優(yōu)化以追求更高的執(zhí)行效率。解決實(shí)際問(wèn)題時(shí),首先應(yīng)對(duì)問(wèn)題進(jìn)行全面、深入分析,得到最優(yōu)的算法之后再動(dòng)手寫(xiě)代碼。在代碼層面也有很多優(yōu)化的思路,例如使用合適的數(shù)據(jù)類(lèi)型、利用緩存機(jī)制、只導(dǎo)入模塊中確實(shí)用到的對(duì)象、減少不必要的計(jì)算等。具體到循環(huán)結(jié)構(gòu),應(yīng)盡量減少循環(huán)體中的重復(fù)計(jì)算,能在循環(huán)外進(jìn)行的計(jì)算就不要放到循環(huán)體中,能在外循環(huán)中進(jìn)行的計(jì)算就不要放到內(nèi)循環(huán)中。3.3.4循環(huán)結(jié)構(gòu)優(yōu)化下面的代碼用來(lái)生成幾個(gè)數(shù)字能夠組成的所有3位數(shù),digits=(1,2,3,4,5)foriindigits:forjindigits:forkindigits:print(i*100+j*10+k)在上面的代碼中,最內(nèi)層循環(huán)中的乘法計(jì)算就屬于不必要的重復(fù)計(jì)算,可以考慮往外提,修改為下面的代碼,從而獲得更高的執(zhí)行效率。digits=(1,2,3,4,5)foriindigits:i=i*100forjindigits:j=i+j*10forkindigits:print(j+k)3.4異常處理結(jié)構(gòu)--3.4.1異常概念與表現(xiàn)形式異常是指代碼運(yùn)行時(shí)由于輸入的數(shù)據(jù)不合法或者某個(gè)條件臨時(shí)不滿足發(fā)生的錯(cuò)誤。例如,除法運(yùn)算中除數(shù)為0,變量名不存在或拼寫(xiě)錯(cuò)誤,要打開(kāi)的文件不存在、權(quán)限不足或者用法不對(duì)(例如試圖寫(xiě)入以只讀模式打開(kāi)的文件),操作數(shù)據(jù)庫(kù)時(shí)SQL語(yǔ)句語(yǔ)法不正確或指定的表名、字段名不存在,要求輸入整數(shù)但實(shí)際輸入的內(nèi)容無(wú)法使用內(nèi)置函數(shù)int()轉(zhuǎn)換為整數(shù),要訪問(wèn)的屬性不存在,文件傳輸過(guò)程中網(wǎng)絡(luò)連接突然斷開(kāi),這些情況都會(huì)引發(fā)代碼異常。代碼一旦引發(fā)異常就會(huì)崩潰,如果得不到正確的處理會(huì)導(dǎo)致整個(gè)程序中止運(yùn)行。3.4.1異常概念與表現(xiàn)形式一般而言,在異常信息的最后一行明確給出了異常的類(lèi)型或者導(dǎo)致錯(cuò)誤的原因,倒數(shù)第二行會(huì)給出導(dǎo)致崩潰的那一行代碼。把下面的代碼保存為文件“測(cè)試.py”并運(yùn)行。values=eval(input('請(qǐng)輸入一個(gè)列表:'))num=int(input('請(qǐng)輸入一個(gè)整數(shù):'))print('最后一次出現(xiàn)的位置:',values.rindex(num))3.4.2異常處理結(jié)構(gòu)語(yǔ)法與應(yīng)用(1)try...except...else...finally...異常處理結(jié)構(gòu)的完整語(yǔ)法形式如下:try:#可能會(huì)引發(fā)異常的代碼塊except異常類(lèi)型1as變量1:#處理異常類(lèi)型1的代碼塊[except異常類(lèi)型2as變量2:#處理異常類(lèi)型2的代碼塊....][else:#如果try塊中的代碼沒(méi)有引發(fā)異常,就執(zhí)行這里的代碼塊][finally:#不論try塊中的代碼是否引發(fā)異常,也不論異常是否被處理#總是最后執(zhí)行這里的代碼塊]3.4.2異常處理結(jié)構(gòu)語(yǔ)法與應(yīng)用(2)assert斷言在程序中某些位置,可能需要某個(gè)條件必須得到滿足才能繼續(xù)執(zhí)行后面的代碼。這時(shí),可以使用斷言語(yǔ)句assert來(lái)確認(rèn)某個(gè)條件是否滿足,要求的條件滿足時(shí)不會(huì)有任何提示,什么也不會(huì)發(fā)生,默默地繼續(xù)執(zhí)行后面的代碼,如果要求的條件不滿足則會(huì)引發(fā)異常。斷言語(yǔ)句assert的語(yǔ)法形式如下:assertcondition,information其中,condition可以是任何表達(dá)式,assert要求這個(gè)表達(dá)式的值必須等價(jià)于True,否則就會(huì)引發(fā)異常,information用來(lái)指定異常具體信息的字符串。3.4.2異常處理結(jié)構(gòu)語(yǔ)法與應(yīng)用>>>assert3==5,'兩個(gè)數(shù)字不相等'AssertionError:兩個(gè)數(shù)字不相等>>>a=input('輸入密碼:')輸入密碼:1234>>>b=input('再輸入一次密碼:')再輸入一次密碼:12345>>>try:asserta==bexcept:print('兩次輸入的密碼不一樣')兩次輸入的密碼不一樣>>>assertint(a:=input('請(qǐng)輸入一個(gè)大于0的正整數(shù):'))>0請(qǐng)輸入一個(gè)大于0的正整數(shù):3>>>print(a)33.4.2異常處理結(jié)構(gòu)語(yǔ)法與應(yīng)用(3)raise關(guān)鍵字關(guān)鍵字raise可以用來(lái)在程序中顯式引發(fā)異?;蛘咧匦聮伋鲎詈笠粋€(gè)異常。如果raise關(guān)鍵字后面沒(méi)有任何表達(dá)式就重新拋出當(dāng)前程序執(zhí)行過(guò)程中最后一個(gè)異常,如果當(dāng)前沒(méi)有異常就簡(jiǎn)單地拋出一個(gè)RuntimeError表示發(fā)生了錯(cuò)誤。#當(dāng)前沒(méi)有異常,直接拋出RuntimeError>>>raiseRuntimeError:Noactiveexceptiontoreraise#重新拋出最后發(fā)生的一個(gè)錯(cuò)誤>>>try:print('A'+32)except:raiseTraceback(mostrecentcalllast):File"<pyshell#19>",line2,in<module>print('A'+32)TypeError:canonlyconcatenatestr(not"int")tostr3.5綜合例題解析例3-7編寫(xiě)程序,接收一個(gè)正整數(shù)n,輸出所有的n位水仙花數(shù)。如果一個(gè)n位正整數(shù)的各位數(shù)字的n次方之和等于這個(gè)數(shù)字本身,那么這個(gè)正整數(shù)是水仙花數(shù)。例如153是3位水仙花數(shù),因?yàn)?53=1^3+5^3+3^3,再例如370、371、407都是3位水仙花數(shù),1634、8208、9474是4位水仙花數(shù),54748、92727、93084是5位水仙花數(shù),只有548834這一個(gè)6位水仙花數(shù),7位水仙花數(shù)有1741725、4210818、9800817、9926315。3.5綜合例題解析fromtimeimporttimetry:n=int(input('請(qǐng)輸入一個(gè)正整數(shù):'))assertn>0except:print('輸入的不是正整數(shù)。')else:func=lambdad:int(d)**n#記錄當(dāng)前時(shí)間start=time()#遍歷所有n位正整數(shù)fornuminrange(10**(n-1),10**n):ifsum(map(func,str(num)))==num:print(num)#記錄當(dāng)前時(shí)間end=time()#輸出兩次調(diào)用time()函數(shù)的時(shí)間差,也就是中間一段代碼的運(yùn)行時(shí)間print(f'用時(shí):{end-start}秒')運(yùn)行結(jié)果為:請(qǐng)輸入一個(gè)正整數(shù):8246780502467805188593477用時(shí):428.76689076423645秒3.5綜合例題解析例3-8編寫(xiě)程序,打印九九乘法表。foriinrange(1,10):forjinrange(1,i+1):#{i*j:<2d}表示計(jì)算并替換表達(dá)式i*j的值#把計(jì)算結(jié)果格式化為2位字符串,不足2位的使用空格填充#<表示左對(duì)齊,也就是在右側(cè)填充空格print(f'{i}*{j}={i*j:<2d}',end='')print()3.5綜合例題解析例3-9編寫(xiě)程序,求解雞兔同籠問(wèn)題。通過(guò)鍵盤(pán)輸入雞和兔的總數(shù)以及腿的數(shù)量,計(jì)算并輸出雞、兔各有多少只。在數(shù)學(xué)上,這是個(gè)二元一次方程組的求解問(wèn)題,假設(shè)使用m表示雞和兔的頭的數(shù)量,使用n表示腿的數(shù)量,使用x表示雞的數(shù)量,使用y表示兔的數(shù)量,那么方程求解的過(guò)程為:3.5綜合例題解析try:m=int(input('請(qǐng)輸入雞和兔的總數(shù):'))n=int(input('請(qǐng)輸入籠子里腿的總數(shù):'))except:print('兩個(gè)數(shù)字必須都是整數(shù)。')else:y=(n-2*m)/2x=m-yify==int(y)andy>0andx>0:print(f'雞{x}只,兔{y}只。')else:print('無(wú)解。')運(yùn)行結(jié)果為:請(qǐng)輸入雞和兔的總數(shù):30請(qǐng)輸入籠子里腿的總數(shù):90雞15.0只,兔15.0只。3.5綜合例題解析例3-10編寫(xiě)程序,計(jì)算百錢(qián)買(mǎi)百雞問(wèn)題。假設(shè)公雞5元一只,母雞3元一只,小雞1元三只,現(xiàn)在有100塊錢(qián),想買(mǎi)100只雞,輸出所有可能的購(gòu)買(mǎi)方案。#假設(shè)能買(mǎi)x只公雞,x最大為20forxinrange(21):#假設(shè)能買(mǎi)y只母雞foryinrange((100-5*x)//3+1):#假設(shè)能買(mǎi)z只小雞z=100-x-y#仔細(xì)體會(huì)兩個(gè)條件的先后順序ifz%3==0and(5*x+3*y+z//3==100):print(f'公雞{x}只,母雞{y}只,小雞{z}只')運(yùn)行結(jié)果為:公雞0只,母雞25只,小雞75只公雞4只,母雞18只,小雞78只公雞8只,母雞11只,小雞81只公雞12只,母雞4只,小雞84只3.5綜合例題解析例3-11編寫(xiě)程序,輸入一個(gè)正整數(shù)n,然后計(jì)算前n個(gè)正整數(shù)的階乘之和1!+2!+3!+...+n!的值。try:n=int(input('請(qǐng)輸入一個(gè)正整數(shù):'))assertn>0except:print('必須輸入正整數(shù)。')else:#result表示前n項(xiàng)的和,temp表示每一項(xiàng)result,temp=0,1#充分利用相鄰兩項(xiàng)之間的關(guān)系,減少不必要的計(jì)算,提高執(zhí)行效率foriinrange(1,n+1):temp=temp*iresult=result+tempprint(result)連續(xù)幾次運(yùn)行結(jié)果為:請(qǐng)輸入一個(gè)正整數(shù):433請(qǐng)輸入一個(gè)正整數(shù):302744108184701421342097037809403133.5綜合例題解析例3-12編寫(xiě)程序,驗(yàn)證6174猜想。1955年,卡普耶卡(D.R.Kaprekar)對(duì)4位數(shù)字進(jìn)行了研究,發(fā)現(xiàn)一個(gè)規(guī)律:對(duì)任意各位數(shù)字不相同的4位數(shù),使用各位數(shù)字能組成的最大數(shù)減去能組成的最小數(shù),對(duì)得到的差重復(fù)這個(gè)操作,最終會(huì)得到6174這個(gè)數(shù)字,并且這個(gè)操作最多不會(huì)超過(guò)7次。3.5綜合例題解析fromstringimportdigitsfromitertoolsimportcombinationsforitemincombinations(digits,4):times=0whileTrue:#當(dāng)前選擇的4個(gè)數(shù)字能夠組成的最大數(shù)和最小數(shù)big=int(''.join(sorted(item,reverse=True)))little=int(str(big)[::-1])difference=big-littletimes=times+1#如果最大數(shù)和最小數(shù)相減得到6174就退出#否則就對(duì)得到的差重復(fù)這個(gè)操作#最多7次,總能得到6174ifdifference==6174:iftimes>7:print(times)break
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務(wù)師實(shí)操案例分析試題及答案
- 年度經(jīng)理工作規(guī)劃計(jì)劃
- 公司生產(chǎn)工作計(jì)劃提升員工技能
- 開(kāi)發(fā)新市場(chǎng)的戰(zhàn)略規(guī)劃計(jì)劃
- 電子商務(wù)標(biāo)識(shí)與信譽(yù)構(gòu)建試題及答案
- 學(xué)校特色品牌建設(shè)計(jì)劃
- 秋季節(jié)能減排活動(dòng)計(jì)劃
- 物流供應(yīng)鏈的環(huán)節(jié)分析國(guó)際物流師試題及答案
- 2024物理期末復(fù)習(xí)試題及答案
- 持續(xù)提升的預(yù)算員試題及答案
- 安全生產(chǎn)、文明施工資金保障制度11142
- 安徽省C20教育聯(lián)盟2024-2025學(xué)年九年級(jí)下學(xué)期3月月考數(shù)學(xué)試題 (原卷版+解析版)
- 2025新疆機(jī)場(chǎng)(集團(tuán))有限責(zé)任公司阿克蘇管理分公司第一季度招聘(75人)筆試參考題庫(kù)附帶答案詳解
- 品質(zhì)異常處罰細(xì)則及獎(jiǎng)罰制度
- 二年級(jí)下冊(cè)心理健康教案-第二十四課 幫爸爸媽媽分擔(dān) 媽媽謝謝您|北師大版
- 人教PEP版五年級(jí)英語(yǔ)下冊(cè)-《課時(shí)學(xué)練測(cè)》全冊(cè)含答案
- 鍋爐水冷壁安裝作業(yè)指導(dǎo)書(shū)
- 《雷鋒叔叔_你在哪里》說(shuō)課稿
- 贊美詩(shī)歌400首全集
- 橫向分布系數(shù)計(jì)算剖析
- 北京市建筑施工作業(yè)人員安全生產(chǎn)知識(shí)教育培訓(xùn)考核試卷A及答案知識(shí)講解
評(píng)論
0/150
提交評(píng)論