版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
程序流程控制03在Python語言中,常用的程序結(jié)構(gòu)包括順序、選擇和循環(huán)。程序中的語句默認(rèn)自上而下順序執(zhí)行,但通過選擇和循環(huán)結(jié)構(gòu)可以改變語句的執(zhí)行順序,實現(xiàn)特定的業(yè)務(wù)邏輯。一個完整的選擇結(jié)構(gòu)或循環(huán)結(jié)構(gòu)可以看作是一條大的“語句”,宏觀上來說,程序中的多條“語句”還是順序執(zhí)行的。從形式上來看,程序結(jié)構(gòu)被分成3種,但在實際編程過程中,3種結(jié)構(gòu)可能搭配在一起使用:一個程序中既有順序、又有選擇和循環(huán);有的甚至還會出現(xiàn)“嵌套”的形式,如選擇里面套有選擇、選擇里面套有循環(huán)、循環(huán)里面套有選擇、循環(huán)里面套有循環(huán)等。這完全由實際問題的需要而定。編程人員應(yīng)該在掌握Python編程知識的基礎(chǔ)上,靈活應(yīng)對實際問題,巧妙利用3種程序結(jié)構(gòu),以便設(shè)計出高質(zhì)量的應(yīng)用程序。內(nèi)容簡介本章內(nèi)容順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)turtle庫的使用應(yīng)用實例計算機(jī)程序是一組描述某個問題的求解算法并能被計算機(jī)識別和執(zhí)行的指令序列。程序控制結(jié)構(gòu)是指計算機(jī)程序中以某種邏輯次序執(zhí)行的一系列操作的語句組織結(jié)構(gòu)。計算機(jī)的程序流程通常由:順序、選擇、循環(huán)三種基本結(jié)構(gòu)組成。程序的順序結(jié)構(gòu)是指按語句出現(xiàn)的先后順序執(zhí)行的程序結(jié)構(gòu)。程序設(shè)計語言并不提供專門的控制流語句來表達(dá)順序控制結(jié)構(gòu),而用程序語句的自然排列(即從上到下、從左至右)順序來表達(dá)。3.1順序結(jié)構(gòu)【例3-1】設(shè)計一程序從鍵盤讀入圓的半徑,完成圓面積的計算并輸出輸出圓的面積。3.1順序結(jié)構(gòu)1234importmathr=eval(input('請輸入圓的半徑:'))s=math.pi*r*rprint(f'半徑為{r}的圓的面積為{s:.2f}。')>>>請輸入圓的半徑:12半徑為12的圓的面積為452.39。選擇結(jié)構(gòu),也稱分支結(jié)構(gòu),包含條件判斷語句(控制選擇的條件表達(dá)式語句)和可選擇執(zhí)行的語句塊。條件表達(dá)式可以是各種類型的表達(dá)式,如算術(shù)表達(dá)式、關(guān)系表達(dá)式、成員運(yùn)算表達(dá)式。當(dāng)條件表達(dá)式的值為False、0、空串、空列表、空字典、空集合時,條件表達(dá)式的邏輯值為假,否則條件表達(dá)式的邏輯值便為真。常見的選擇結(jié)構(gòu)有單分支、雙分支、多分支、結(jié)構(gòu)化模式匹配及嵌套的分支結(jié)構(gòu)。3.2選擇結(jié)構(gòu)3.2選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)語句雙分支選擇結(jié)構(gòu)語句多分支選擇結(jié)構(gòu)語句結(jié)構(gòu)化模式匹配語句分支語句的嵌套單分支選擇結(jié)構(gòu)語法形式如下:當(dāng)條件表達(dá)式的值為True或其他與True等價的值時,語句塊被執(zhí)行,否則該語句塊不被執(zhí)行。最后跳出分支結(jié)構(gòu),繼續(xù)執(zhí)行后面的代碼(如果有)。if語句后面的冒號“:”必不可少,表示一個語句塊的開始,并且語句塊必須做相應(yīng)的縮進(jìn),一般是以4個空格為縮進(jìn)單位。語句塊:可以是單條語句,也可以是多條語句。多條語句的縮進(jìn)必須對齊一致。3.2.1單分支選擇結(jié)構(gòu)語句if條件表達(dá)式:
語句塊【例3-2】輸入3個整數(shù),按從大到小的順序輸出。3個數(shù)的排序,一共有6種可能,如右圖所示。3.2.1單分支選擇結(jié)構(gòu)語句123456789101112131415x=int(input("請輸入一個整數(shù)x:"))y=int(input("請輸入一個整數(shù)y:"))z=int(input("請輸入一個整數(shù)z:"))ifx>y>z:print("三個數(shù)降序排序結(jié)果為:",x,y,z)ifx>z>y:print("三個數(shù)降序排序結(jié)果為:",x,z,y)ify>x>z:print("三個數(shù)降序排序結(jié)果為:",y,x,z)ify>z>x:print("三個數(shù)降序排序結(jié)果為:",y,z,x)ifz>x>y:print("三個數(shù)降序排序結(jié)果為:",z,x,y)ifz>y>x:print("三個數(shù)降序排序結(jié)果為:",z,y,x)>>>
請輸入一個整數(shù)x:10請輸入一個整數(shù)y:15請輸入一個整數(shù)z:5三個數(shù)降序排序結(jié)果為:15105【例3-3】汽車限號提醒(1)。為了減輕車輛快速增長而造成的交通負(fù)擔(dān),降低機(jī)動車尾氣排放量,將空氣污染指數(shù)控制在一個合理的范圍內(nèi),全國各地出臺了相應(yīng)的尾號限行政策。以北京為例,周一至周五限行機(jī)動車車牌尾號分別為:4和9、5和0、1和6、2和7、3和8。3.2.1單分支選擇結(jié)構(gòu)語句12345678910111213x=int(input("請輸入今天是星期幾?(填寫數(shù)字1~7)"))ifx==1:print("今日限行,限行車牌尾號為:4和9!")ifx==2:print("今日限行,限行車牌尾號為:5和0!")ifx==3:print("今日限行,限行車牌尾號為:6和1!")ifx==4:print("今日限行,限行車牌尾號為:7和2!")ifx==5:print("今日限行,限行車牌尾號為:8和3!")if(x==6)or(x==7):print("今日不限行!")>>>請輸入今天是星期幾?(填寫數(shù)字1~7)3今日限行,限行車牌尾號為:6和1!雙分支結(jié)構(gòu)語法形式如下:當(dāng)條件表達(dá)式的值為True或其他與True等價的值時,執(zhí)行語句塊1,否則執(zhí)行語句塊2。最后跳出分支結(jié)構(gòu),繼續(xù)執(zhí)行后面的代碼(如果有)。else語句一定不可以單獨(dú)使用,必須和if一起使用。if、else語句后面都必須有冒號“:”。3.2.2雙分支選擇結(jié)構(gòu)語句if條件表達(dá)式:語句塊1else:
語句塊2【例3-4】汽車限號提醒(2)。如果用戶只關(guān)心今日是否限行兩種情況,可以通過雙分支語句完成。3.2.2雙分支選擇結(jié)構(gòu)語句12345x=int(input("請輸入今天是星期幾?(填寫數(shù)字1~7)"))if(x!=6)and(x!=7):print("今日限行!")else:print("今日不限行!")>>>請輸入今天是星期幾?(填寫數(shù)字1~7)3今日限行!雙分支結(jié)構(gòu)還有一種更簡潔的表達(dá)方式,適合通過判斷條件表達(dá)式返回特定值。語法格式如下:當(dāng)條件表達(dá)式的值為True或與True等價的值時,返回表達(dá)式1的值,否則返回表達(dá)式2的值。其中,表達(dá)式1、2一般是數(shù)字類型或字符串類型的一個值。例如,如果x>=0,則y=x,否則y=0,可以表達(dá)為:【例3-4】汽車限號提醒(2)程序還可修改為如下代碼3.2.2雙分支選擇結(jié)構(gòu)語句<表達(dá)式1>if<條件表達(dá)式>else<表達(dá)式2>>>>x=eval(input('請輸入x的值:'))請輸入x的值:5>>>y=xifx>=0else0>>>y512x=int(input("請輸入今天是星期幾?(填寫數(shù)字1~7)"))print("今日{(diào)}!".format("限行"if(x!=6)and(x!=7)else"不限行"))【例3-5】編程判斷某一年是否為閏年。判斷閏年的條件是:年份能被4整除但不能被100整除,或者能被400整除,其判斷流程如圖所示。3.2.2雙分支選擇結(jié)構(gòu)語句12345Year=int(input("請輸入任意年份:"))if(Year%4==0andYear%100!=0)orYear%400==0:print("是閏年")else:print("不是閏年")>>>請輸入任意年份:2022不是閏年>>>
請輸入任意年份:2020是閏年多分支結(jié)構(gòu)語法形式如下:依次評估尋找第一個結(jié)果為True或其他與True等價的條件,執(zhí)行該條件下的語句塊,如果沒有任何條件成立,else下面的語句塊將被執(zhí)行,else子句是可選的。最后跳出分支結(jié)構(gòu),繼續(xù)執(zhí)行后面的代碼。elif可以理解為是elseif的縮寫,必須和if一起使用,不能單獨(dú)使用。if、elif、else每個語句后面都必須有冒號“:”。3.2.3多分支選擇結(jié)構(gòu)語句if條件表達(dá)式1:語句塊1elif條件表達(dá)式2:
語句塊2elif條件表達(dá)式3:
語句塊3…[else:
語句塊n]在【例3-3】汽車限號提醒(1)程序中通過多條獨(dú)立的if語句對同一個變量x進(jìn)行判斷,這種情況更適合多分支結(jié)構(gòu),優(yōu)化后的代碼如下:3.2.3多分支選擇結(jié)構(gòu)語句12345678910111213x=int(input("請輸入今天是星期幾?(填寫數(shù)字1~7)"))ifx==1:print("今日限行,限行車牌尾號為:4和9!")elifx==2:print("今日限行,限行車牌尾號為:5和0!")elifx==3:print("今日限行,限行車牌尾號為:6和1!")elifx==4:print("今日限行,限行車牌尾號為:7和2!")elifx==5:print("今日限行,限行車牌尾號為:8和3!")else:print("今日不限行!")【例3-6】猜數(shù)字游戲(1)。猜數(shù)字是一個古老的益智類密碼破譯小游戲,通常由兩個人參與。游戲開始后一個人設(shè)置一個數(shù)字,一個人猜數(shù)字,每當(dāng)猜數(shù)字的人說出一個數(shù)字時由設(shè)置數(shù)字的人告知是否猜中:若猜測的數(shù)字大于設(shè)置的數(shù)字,提示“很遺憾,你猜大了!”;若猜測的數(shù)字小于設(shè)置的數(shù)字,提示“很遺憾,你猜小了!”;若猜中,則提示“恭喜,猜數(shù)成功!”。3.2.3多分支選擇結(jié)構(gòu)語句12345678num=9#設(shè)置謎底guess=int(input("請猜0~9之間的數(shù)字:"))ifguess>num:print("很遺憾,你猜大了!")elifguess<num:print("很遺憾,你猜小了!")else:print("恭喜,猜數(shù)成功!")【例3-6】猜數(shù)字游戲(1)。猜數(shù)字是一個古老的益智類密碼破譯小游戲,通常由兩個人參與。游戲開始后一個人設(shè)置一個數(shù)字,一個人猜數(shù)字,每當(dāng)猜數(shù)字的人說出一個數(shù)字時由設(shè)置數(shù)字的人告知是否猜中:若猜測的數(shù)字大于設(shè)置的數(shù)字,提示“很遺憾,你猜大了!”;若猜測的數(shù)字小于設(shè)置的數(shù)字,提示“很遺憾,你猜小了!”;若猜中,則提示“恭喜,猜數(shù)成功!”。3.2.3多分支選擇結(jié)構(gòu)語句12345678num=9#設(shè)置謎底guess=int(input("請猜0~9之間的數(shù)字:"))ifguess>num:print("很遺憾,你猜大了!")elifguess<num:print("很遺憾,你猜小了!")else:print("恭喜,猜數(shù)成功!")>>>請猜0~9之間的數(shù)字:5很遺憾,你猜小了!>>>
請猜0~9之間的數(shù)字:9恭喜,猜數(shù)成功!>>>
請猜0~9之間的數(shù)字:10很遺憾,你猜大了!>>>
請猜0~9之間的數(shù)字:-4很遺憾,你猜小了!Python3.10版本開始新增加了一個結(jié)構(gòu)化模式匹配語句match-case,類似于其他語言如C中的switch-case,它可以方便的匹配想要的內(nèi)容,可以作為一部分if-elif-else多分支語句的替代,減少代碼量。match-case語句語法形式如下:功能:將變量的值依次匹配case后面的模式,尋找到第一個匹配的模式則結(jié)束匹配,執(zhí)行對應(yīng)case塊內(nèi)的語句;如果沒有匹配的模式,則執(zhí)行case_塊內(nèi)的語句。注意,最后一個case語句與_之間有空格。3.2.4結(jié)構(gòu)化模式匹配語句match變量名:casepattern_1:
語句塊1casepattern_2:
語句塊2
…case_:
語句塊n示例代碼3.2.4結(jié)構(gòu)化模式匹配語句1234567891011s=int(input('請輸入數(shù)值:'))matchs:case1:print('星期一')#少量語句可以寫在同一行case2:print('星期二')case3:print('星期三')case4:print('星期四')case5:print('星期五')case6:print('星期六')case7:print('星期天')#也可另起一行縮進(jìn)case_:print('輸入錯誤')>>>
請輸入數(shù)值:1星期一>>>
請輸入數(shù)值:10輸入錯誤match-case還可以使用邏輯或符號“|”實現(xiàn)多條件匹配,casepattern_1|pattern_2|pattern_3|…如同if條件1or條件2or條件3…3.2.4結(jié)構(gòu)化模式匹配語句12345678s=int(input('請輸入數(shù)值:'))matchs:case1|2|3|4|5:#邏輯或|符號print('工作日')case6|7:print('周末')case_:print('輸入錯誤')>>>
請輸入數(shù)值:1工作日>>>
請輸入數(shù)值:5工作日>>>
請輸入數(shù)值:7周末>>>
請輸入數(shù)值:10輸入錯誤match-case語句不僅可以匹配數(shù)字、字符串、列表、字典、元組等不同的數(shù)據(jù)類型,而且還支持通配符匹配。分支結(jié)構(gòu)中,如果語句本身也是一段if語句,則構(gòu)成分支語句的嵌套結(jié)構(gòu)。3.2.5分支結(jié)構(gòu)的嵌套if表達(dá)式1:語句塊1if表達(dá)式2:
語句塊2else:
語句塊3if表達(dá)式1:語句塊1if表達(dá)式2:
語句塊2else:
語句塊3else:if表達(dá)式4:
語句塊4else:
語句塊5【例3-7】判斷某一年是否為閏年,判斷閏年的條件是:年份能被4整除但不能被100整除,或者能被400整除。3.2.4分支結(jié)構(gòu)的嵌套1234567891011Year=int(input("請輸入一個四位數(shù)的年份:"))ifYear%400==0:print("是閏年")else:ifYear%4==0:ifYear%100==0:print("不是閏年")else:print("是閏年")else:print("不是閏年")【例3-8】階梯電價。為了提倡居民節(jié)約用電,某省電力公司執(zhí)行“階梯電價”,安裝一戶一表的居民用戶電價分為3個“階梯”。第一檔:年用電量0~2160度,電價為0.6元/度;第二檔:年用電量2160~4200度,超出部分電價為0.65元/度;第三檔:年用電量超過4200度,超出部分電價為0.9元/度。
請編寫程序計算電費(fèi)。分析:根據(jù)外部輸入的年用電量x,電費(fèi)cost的判斷邏輯為:if0<=x<=2160,cost=0.6*xif2160<x<=4200,cost=2160*0.6+(x-2160)*0.65ifx>4200,cost=2160*0.6+(4200-2160)*0.65+(x-4200)*0.9最后,輸出電費(fèi)。3.2.4分支結(jié)構(gòu)的嵌套【例3-8】階梯電價。為了提倡居民節(jié)約用電,某省電力公司執(zhí)行“階梯電價”,安裝一戶一表的居民用戶電價分為3個“階梯”。3.2.4分支結(jié)構(gòu)的嵌套1234567891011x=float(input("請輸入年用電量:"))ifx>=0:ifx<=2160:cost=0.6*xelif4200>=x>2160:cost=2160*0.6+(x-2160)*0.65else:cost=2160*0.6+(4200-2160)*0.65+(x-4200)*0.9print("應(yīng)付電費(fèi):",cost)else:print("數(shù)據(jù)錯誤!")>>>請輸入年用電量:1000應(yīng)付電費(fèi):600.0【例3-9】判斷回文。輸入一個字符串S,判斷S是否是回文數(shù);如果是回文數(shù),判斷該字符串是否以“69”開頭;如果是,則輸出該字符串中的一半字符。分析:回文數(shù)是指一個數(shù)正向排列與反向排列一樣,例如121是回文,可以通過字符串的索引訪問,也可以通過字符串的切片得到S的倒置串S[::-1]。判斷是否以“69”開頭,可以使用S.startswith()方法。字符串的一半則通過len(S)//2得到索引值的范圍。3.2.4分支結(jié)構(gòu)的嵌套12345678S=input('請輸入數(shù)字字符串:')ifS==S[::-1]:#判斷原串跟倒置串是否相等print("是回文數(shù)")ifS.startswith("69"):#判斷是否以“69”開頭x=len(S)//2print("字符串中一半的字符是:",S[0:x])#獲得一半的切片else:print("不是回文數(shù)")>>>請輸入數(shù)字字符串:699878996是回文數(shù)字符串中一半的字符是:6998循環(huán)結(jié)構(gòu)用來重復(fù)執(zhí)行一條或多條語句,被重復(fù)執(zhí)行的那些語句塊稱為循環(huán)體。使用循環(huán)結(jié)構(gòu),可以減少源程序重復(fù)書寫的工作量。Python中主要有while循環(huán)語句、for循環(huán)語句及嵌套的循環(huán)結(jié)構(gòu),并且還經(jīng)常和選擇結(jié)構(gòu)嵌套使用來實現(xiàn)更為復(fù)雜的業(yè)務(wù)邏輯。while循環(huán)一般用于循環(huán)次數(shù)難以確定的情況,也可用于循環(huán)次數(shù)確定的情況for循環(huán)一般用于循環(huán)次數(shù)已知的情況有時為了提前結(jié)束循環(huán)需用到break或continue語句。3.3循環(huán)結(jié)構(gòu)3.3循環(huán)結(jié)構(gòu)while循環(huán)結(jié)構(gòu)語句for循環(huán)結(jié)構(gòu)語句循環(huán)的嵌套循環(huán)中的break和continue語句循環(huán)中的else子句while語句通過判斷條件來控制是否要繼續(xù)執(zhí)行循環(huán)體中的語句塊,通常用于循環(huán)次數(shù)不確定的場合。語法形式如下:當(dāng)條件表達(dá)式的值為True或其他與True等價的值時,循環(huán)體中的語句塊被重復(fù)執(zhí)行,直到條件為False時才退出循環(huán)。繼續(xù)執(zhí)行后面與while同級別縮進(jìn)的代碼while語句后面的冒號“:”必不可少。循環(huán)體可以是單條語句,也可以是多條語句。多條語句的縮進(jìn)必須對齊一致。
使用while語句時,要注意條件的設(shè)置,否則可能會導(dǎo)致無限循環(huán)。若發(fā)現(xiàn)程序陷入了無限循環(huán),可以按Ctrl+C強(qiáng)制中斷程序的執(zhí)行。3.3.1while循環(huán)結(jié)構(gòu)語句while條件表達(dá)式:
循環(huán)體【例3-10】對用戶輸入的N個數(shù)據(jù)求和。3.3.1while循環(huán)結(jié)構(gòu)語句12345678N=int(input("請輸入求和的數(shù)據(jù)個數(shù):"))i=1sum=0whilei<=N:y=int(input(f"請輸入第{i}個數(shù)據(jù):"))sum=sum+yi=i+1print(f"{N}個數(shù)的和是:{sum}")>>>請輸入求和的數(shù)據(jù)個數(shù):4請輸入第1個數(shù)據(jù):1請輸入第2個數(shù)據(jù):3請輸入第3個數(shù)據(jù):4請輸入第4個數(shù)據(jù):104個數(shù)的和是:18【例3-11】用戶登錄模塊。用戶輸入賬號和密碼進(jìn)行登錄,如果錯誤,則繼續(xù)輸入直到賬號和密碼正確為止,顯示登錄成功!假設(shè)賬號為“user”,密碼為“123456”。3.3.1while循環(huán)結(jié)構(gòu)語句1234567Id=input("請輸入賬號:")Pwd=input("請輸入密碼:")while(Id!="user")or(Pwd!="123456"):print("賬號或密碼有誤,請重新輸入!")Id=input("請重新輸入賬號:")Pwd=input("請重新輸入密碼:")print("登錄成功")>>>請輸入賬號:hello請輸入密碼:111111賬號或密碼有誤,請重新輸入!請重新輸入賬號:user請重新輸入密碼:111111賬號或密碼有誤,請重新輸入!請重新輸入賬號:hello請重新輸入密碼:123456賬號或密碼有誤,請重新輸入!請重新輸入賬號:user請重新輸入密碼:123456登錄成功【例3-12】猜數(shù)字游戲(2)。對例3-7進(jìn)行如下改進(jìn),若玩家猜錯則繼續(xù)猜,直到猜中為止,統(tǒng)計玩家猜中所用次數(shù)。程序中設(shè)置的數(shù)字為0-9之間的隨機(jī)數(shù)。分析:預(yù)設(shè)的數(shù)字num由隨機(jī)函數(shù)給出,可以通過random庫實現(xiàn);玩家循環(huán)猜數(shù)字guess直到猜中為止,重復(fù)的次數(shù)是不確定的,因此采用while循環(huán)語句實現(xiàn),循環(huán)條件為“guess!=num”,即“未猜中”。當(dāng)(guess!=num)為True(未猜中),提示“大了”或“小了”,猜測次數(shù)count+1,繼續(xù)猜數(shù),然后循環(huán)判斷,直到(guess!=num)為False(猜中),結(jié)束循環(huán),輸出猜中所用次數(shù)count。根據(jù)分析可知,該算法是循環(huán)結(jié)構(gòu)中嵌套了分支結(jié)構(gòu)。3.3.1while循環(huán)結(jié)構(gòu)語句【例3-12】猜數(shù)字游戲(2)。對例3-7進(jìn)行如下改進(jìn),若玩家猜錯則繼續(xù)猜,直到猜中為止,統(tǒng)計玩家猜中所用次數(shù)。程序中設(shè)置的數(shù)字為0-9之間的隨機(jī)數(shù)。3.3.1while循環(huán)結(jié)構(gòu)語句123456789101112importrandomnum=random.randint(0,9)guess=int(input("請猜一個0~9之間的數(shù)字:"))count=1whileguess!=num:ifguess>num:print("很遺憾,你猜大了!")else:print("很遺憾,你猜小了!")guess=int(input("請猜一個0-9之間的數(shù)字:"))count+=1print("預(yù)測{}次,猜中了!".format(count))>>>
請猜一個0~9之間的數(shù)字:5很遺憾,你猜大了!請猜一個0~9之間的數(shù)字:2很遺憾,你猜大了!請猜一個0~9之間的數(shù)字:1很遺憾,你猜大了!請猜一個0~9之間的數(shù)字:0預(yù)測4次,猜中了!>>>
請猜一個0~9之間的數(shù)字:5很遺憾,你猜小了!請猜一個0~9之間的數(shù)字:7預(yù)測2次,猜中了!for循環(huán)語法形式如下:for語句一般用于實現(xiàn)遍歷循環(huán)。遍歷循環(huán)是從序列中逐一提取元素,賦值給循環(huán)變量,對于提取的每個元素執(zhí)行一次循環(huán)體,一直到遍歷完序列中的每個元素后結(jié)束循環(huán)。for語句后面的冒號“:”必不可少。遍歷結(jié)構(gòu)可以是字符串、文件、列表、元組、字典、集合等,也可以是range()函數(shù)。range()函數(shù)是Python內(nèi)置的函數(shù),用于生成一系列連續(xù)的整數(shù)。其語法格式如下:start表示起始值,可以省略,如果省略則從0開始;stop表示終值,不可省略;step表示步長,即兩個數(shù)之間的間隔,可以省略,如果省略則表示步長為1。3.3.2for循環(huán)結(jié)構(gòu)語句for循環(huán)變量in遍歷結(jié)構(gòu):
循環(huán)體range(start,stop,step)range()函數(shù)的使用range(n)只有一個參數(shù)時,n表示終值,起始值默認(rèn)為0,步長默認(rèn)為1,生成一個含有0、1、...、n-1的整數(shù)序列,取值范圍為[0,n)。例如,range(0)是一個空序列,range(4)生成一個整數(shù)序列0、1、2、3。range(m,n)有兩個參數(shù)時,m表示起點(diǎn),n表示終值,步長默認(rèn)為1,生成一個含有m、m+1、...、n-1的整數(shù)序列,取值范圍為[m,n)。例如,range(m,m)是一個空序列,range(4,7)生成一個整數(shù)序列4、5、6。range(m,n,s)有三個參數(shù)時,m表示起點(diǎn),n表示終值,s表示步長,生成一個序列含有m、m+s、m+2*s、......,終點(diǎn)n不取。如果m>n且s為負(fù)數(shù),則從大往小取值。例如,range(1,7,2)生成一個整數(shù)序列1、3、5,range(7,1,-2)生成一個整數(shù)序列7、5、3。for循環(huán)語句中經(jīng)常使用range()函數(shù)來控制循環(huán)次數(shù)。3.3.2for循環(huán)語句for語句的使用【例3-13】遍歷字符串中的字符并輸出?!纠?-13】還可以使用range()函數(shù)實現(xiàn)。3.3.2for循環(huán)語句>>>foriinrange(-10,-100,-30):print(i,end="")-10-40-70123str="Hello"foriinrange(len(str)):#range()生成0~4,分別賦值給iprint(str[i])#i作為索引值123str="Hello"foriinstr:print(i)>>>Hello【例3-14】求1-100中所有奇數(shù)的和以及偶數(shù)的和。3.3.2for循環(huán)語句12345678910sum_odd=0#奇數(shù)和sum_even=0#偶數(shù)和i=1#循環(huán)變量初始化whilei<=100:#循環(huán)條件
while語句實現(xiàn)ifi%2!=0:sum_odd+=ielse:sum_even+=ii+=1#循環(huán)變量修改print("奇數(shù)和為:{},偶數(shù)和為:{}".format(sum_odd,sum_even))12345678sum_odd=0#奇數(shù)和sum_even=0#偶數(shù)和foriinrange(1,101):#循環(huán)變量初值,循環(huán)條件,循環(huán)變量修改ifi%2!=0:for語句實現(xiàn)sum_odd+=ielse:sum_even+=iprint("奇數(shù)和為:{},偶數(shù)和為:{}".format(sum_odd,sum_even))【例3-15】編寫一個單行動態(tài)刷新進(jìn)度條。進(jìn)度百分比從0~100%,用*表示已經(jīng)完成的部分,用.表示未完成的部分。由于程序執(zhí)行速度超過人眼的視覺停留時間,為了讓用戶體驗更好,需要調(diào)用Python標(biāo)準(zhǔn)時間庫time,使用time.sleep(t)函數(shù)讓程序暫停t秒。要達(dá)到單行顯示的效果,必須在原位置覆蓋輸出,使用'\r'轉(zhuǎn)義字符讓光標(biāo)回到行首。3.3.2for循環(huán)語句12345678910importtimelength=50#文本進(jìn)度條的寬度print('='*24+'開始下載'+'='*24)foriinrange(length+1):completed="*"*i#“*”表示已完成
incomplete="."*(length-i)#“.”表示未完成
per=i/50#完成百分比
print("\r{:>4.0%}[{}{}]".format(per,completed,incomplete),end="")time.sleep(0.5)print("\n"+'='*24+'下載完成'+'='*24)該程序必須在控制臺中運(yùn)行方能看到如圖所示的運(yùn)行結(jié)果在一個循環(huán)結(jié)構(gòu)的循環(huán)體內(nèi)又包含另一個循環(huán)結(jié)構(gòu),這就是循環(huán)的嵌套,也稱為多重循環(huán)。這種嵌套式的結(jié)構(gòu)說明各循環(huán)結(jié)構(gòu)之間是“包含”關(guān)系,即一個循環(huán)結(jié)構(gòu)完全在另一個循環(huán)結(jié)構(gòu)里面,不能交叉。通常把位于里面的循環(huán)稱為“內(nèi)循環(huán)”,外面的循環(huán)稱為“外循環(huán)”。for循環(huán)和while循環(huán)可以互相嵌套3.3.3循環(huán)的嵌套while條件表達(dá)式1:#外循環(huán)while條件表達(dá)式2:#內(nèi)循環(huán)
循環(huán)體2
循環(huán)體1while條件表達(dá)式:#外循環(huán)for循環(huán)變量in遍歷結(jié)構(gòu):#內(nèi)循環(huán)
循環(huán)體2
循環(huán)體1for循環(huán)變量1in遍歷結(jié)構(gòu)1:#外循環(huán)for循環(huán)變量2in遍歷結(jié)構(gòu)2:#內(nèi)循環(huán)
循環(huán)體2
循環(huán)體1for循環(huán)變量in遍歷結(jié)構(gòu):#外循環(huán)while條件表達(dá)式:#內(nèi)循環(huán)
循環(huán)體2
循環(huán)體1【例3-16】有如下循環(huán)嵌套程序,計算內(nèi)循環(huán)總共循環(huán)了多少次。3.3.3循環(huán)的嵌套12345foriinrange(1,4):#外循環(huán)print("外循環(huán)執(zhí)行第{}次".format(i))forjinrange(1,3):#內(nèi)循環(huán)print("-->內(nèi)循環(huán)執(zhí)行第{}次".format(j),end="")print()#換行>>>外循環(huán)執(zhí)行第1次-->內(nèi)循環(huán)執(zhí)行第1次-->內(nèi)循環(huán)執(zhí)行第2次外循環(huán)執(zhí)行第2次-->內(nèi)循環(huán)執(zhí)行第1次-->內(nèi)循環(huán)執(zhí)行第2次外循環(huán)執(zhí)行第3次-->內(nèi)循環(huán)執(zhí)行第1次-->內(nèi)循環(huán)執(zhí)行第2次由此可見,循環(huán)嵌套的執(zhí)行過程:外循環(huán)的循環(huán)體語句執(zhí)行了3次,內(nèi)循環(huán)的循環(huán)體語句執(zhí)行了2*3=6次。【例3-17】使用循環(huán)的嵌套,打印圖形。分析:外循環(huán)的循環(huán)變量i控制行數(shù),范圍是1~4內(nèi)循環(huán)的循環(huán)變量j控制列數(shù)。當(dāng)i=1,打印1列;當(dāng)i=2,打印2列當(dāng)i=3,打印3列......因此行號與列數(shù)之間的關(guān)系式:j=i,內(nèi)循環(huán)次數(shù)為1~i。3.3.3循環(huán)的嵌套1234foriinrange(1,5):#輸出4行forjinrange(1,i+1):#控制列數(shù)print("*",end="")#內(nèi)循環(huán)輸出*print()#換行【例3-17】也可用while循環(huán)嵌套或單循環(huán)實現(xiàn),請讀者自行思考。一般打印圖形的程序中采用for循環(huán)嵌套更簡單、方便,代碼模板如下:3.3.3循環(huán)的嵌套1234foriinrange(1,__A__):#A處填入(行數(shù)+1)forjinrange(1,__B__):#B處填入(列數(shù)+1)print("__C__",end="")#C處填入每次輸出的內(nèi)容print()【例3-18】輸出由1,2,3,4組成的互不相同且無重復(fù)的三位數(shù)。分析:可填在百位、十位、個位的數(shù)字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。采用三重循環(huán)實現(xiàn)。3.3.3循環(huán)的嵌套12345foriinrange(1,5):#百位forjinrange(1,5):#十位forxinrange(1,5):#個位if(i!=j)and(j!=x)and(x!=i):#去除重復(fù)print(str(i)+str(j)+str(x))>>>123124(此處中間結(jié)果略)431432【例3-18】輸出由1,2,3,4組成的互不相同且無重復(fù)的三位數(shù)。滿足條件的數(shù)一共有24個,當(dāng)輸出結(jié)果較多時,可以對輸出數(shù)據(jù)進(jìn)行格式化,比如按每行5個數(shù)據(jù)輸出。優(yōu)化后的代碼如下:3.3.3循環(huán)的嵌套1234567891011count=0#增加一個計數(shù)器foriinrange(1,5):#百位forjinrange(1,5):#十位forxinrange(1,5):#個位if(i!=j)and(j!=x)and(x!=i):print(str(i)+str(j)+str(x)+"\t",end="")count+=1#找到滿足條件的數(shù),計數(shù)器+1ifcount%5==0:print()#換行print()print(f"滿足條件的數(shù)一共有{count}個")>>>123124132134142143213214231234241243312314321324341342412413421423431432滿足條件的數(shù)一共有24個前面介紹的for和while循環(huán)都只有在循環(huán)條件不成立時才結(jié)束循環(huán)。但有時在某種情況下需要提早結(jié)束正在執(zhí)行的循環(huán)操作。例如,在ATM機(jī)取款時循環(huán)輸入密碼的最大次數(shù)為3次,如果3次密碼都輸入錯誤則凍結(jié)賬戶;如果密碼輸入正確就提前結(jié)束,進(jìn)入下一個界面??梢允褂胋reak和continue語句實現(xiàn)提前結(jié)束循環(huán)。break語句:結(jié)束本層循環(huán)continue語句:結(jié)束本次循環(huán)break和continue語句在for和while循環(huán)中都可以使用,一般會與if語句搭配使用,以達(dá)到在特定條件滿足時,改變循環(huán)執(zhí)行流程的目的。3.3.4循環(huán)中的break和continue語句break語句break語句可以提前結(jié)束循環(huán),執(zhí)行循環(huán)語句的后繼語句。如果使用循環(huán)嵌套,break語句只能跳出它所在層的循環(huán)。continue語句continue語句可以提前結(jié)束本次循環(huán),跳過當(dāng)前循環(huán)的剩余語句,接著執(zhí)行下次循環(huán),該語句并不會終止整個循環(huán)。3.3.4循環(huán)中的break和continue語句while條件表達(dá)式1:
語句1if條件表達(dá)式2:break
語句2while條件表達(dá)式1:
語句1if條件表達(dá)式2:continue
語句2break語句與continue語句的應(yīng)用3.3.4循環(huán)中的break和continue語句1234forcharin"Python":ifchar=="h":breakprint(char,end="")1234forcharin"Python":ifchar=="h":continueprint(char,end="")>>>
Pyt>>>
Pyton【例3-19】模擬ATM取款機(jī)程序。提示用戶輸入密碼,如果密碼正確,顯示“恭喜,可以取款了!”;如果密碼錯誤,繼續(xù)輸入,直至連續(xù)3次均輸錯,顯示“卡已凍結(jié)!”分析:可采用while或for實現(xiàn)。若3次機(jī)會用完,循環(huán)正常結(jié)束;如果密碼輸入正確,則提前結(jié)束循環(huán),用break語句實現(xiàn)。假設(shè)初始密碼為“123456”.3.3.4循環(huán)中的break和continue語句12345678910111213print("歡迎使用ATM!")Pwd=input("請輸入密碼:")i=1whilei<=2:ifPwd=="123456":breakelse:Pwd=input("密碼錯誤,重新輸入:")i+=1ifPwd=="123456":print("恭喜,可以取款了!")else:print("卡已凍結(jié)!")>>>歡迎使用ATM!請輸入密碼:123456恭喜,可以取款了!【例3-20】統(tǒng)計輸入字符串的長度,按Q或q結(jié)束。分析:循環(huán)次數(shù)不確定,采用while循環(huán)輸入字符串并統(tǒng)計該字符串的長度,直到用戶輸入Q或q則強(qiáng)制結(jié)束循環(huán)。3.3.4循環(huán)中的break和continue語句123456whileTrue:s=input("請輸入字符串(按Q或q結(jié)束):")ifs.upper()=="Q":breakprint("字符串的長度為:",len(s))print("輸入結(jié)束")>>>請輸入字符串(按Q或q結(jié)束):HelloChina!字符串的長度為:12請輸入字符串(按Q或q結(jié)束):你好,中國!字符串的長度為:6請輸入字符串(按Q或q結(jié)束):q輸入結(jié)束【例3-21】輸出50以內(nèi)能被7整除但不能被5整除的所有整數(shù)。分析:需要對1~50的每一個整數(shù)進(jìn)行判斷,如果滿足條件,則輸出該數(shù);如果不滿足條件,則不輸出。3.3.4循環(huán)中的break和continue語句1234foriinrange(1,51):if(i%7!=0)or(i%5==0):continueprint(i)>>>71421284249for循環(huán)和while循環(huán)中都存在一個else擴(kuò)展用法。else中的語句塊只有在循環(huán)正常終止時才會被執(zhí)行,即循環(huán)正常遍歷完所有元素或由于條件不成立而結(jié)束循環(huán),不是因為break語句提前結(jié)束循環(huán)。continue語句對else沒有影響。3.3.5循環(huán)中的else子句對比用法3.3.5循環(huán)結(jié)構(gòu)中的else語句123456forcharin"Python":ifchar=="h":breakprint(char,end="")else:print("正常結(jié)束循環(huán)")123456forcharin"Python":ifchar=="h":continueprint(char,end="")else:print("正常結(jié)束循環(huán)")>>>
Pyt>>>
Pyton正常結(jié)束循環(huán)turtle庫是Python語言中一個非常流行的入門級的圖形繪制函數(shù)庫。turtle即海龜,想象一只小海龜在畫布上移動,其爬行的軌跡繪制成了各種圖形,如同用戶使用筆在紙上繪圖。turtle圖形繪制的概念誕生于1969年,成功應(yīng)用于Logo編程語言,由于turtle圖形繪制概念十分直觀且深受中小學(xué)編程初學(xué)者的喜愛,逐漸成為Python內(nèi)置的一個標(biāo)準(zhǔn)庫。turtle庫使用之前需要在程序開始處使用import進(jìn)行引用。3.4turtle庫的使用3.4turtle庫的使用創(chuàng)建畫布設(shè)置畫筆繪制圖形圖形窗口也稱畫布??刂婆_無法繪制圖形,因此需要先使用setup()函數(shù)創(chuàng)建畫布,該函數(shù)的語法格式如下:setup(width,height,startx=None,starty=None)功能:設(shè)置畫布的大小和位置。參數(shù):width:畫布的寬度。如果值為整數(shù),表示像素值;如果值為小數(shù),表示畫布寬度占電腦屏幕的比例。height:畫布的高度。如果值為整數(shù),表示像素值;如果值為小數(shù),表示畫布高度占電腦屏幕的比例。startx:畫布左側(cè)與電腦屏幕左側(cè)的像素距離。如果值為None,表示畫布位于電腦屏幕水平中央。starty:畫布頂部與電腦屏幕頂部的像素距離。如果值為None,表示畫布位于電腦屏幕垂直中央。(startx,starty):這一坐標(biāo)表示畫布左上角頂點(diǎn)的起始位置,電腦屏幕左上方起始為(0,0)點(diǎn),默認(rèn)畫布中心即電腦屏幕的中心。3.4.1創(chuàng)建畫布圖形窗口也稱畫布??刂婆_無法繪制圖形,因此需要先使用setup()函數(shù)創(chuàng)建畫布,該函數(shù)的語法格式如下:setup(width,height,startx=None,starty=None)setup()函數(shù)不是必須的,只有當(dāng)需要設(shè)置畫布的大小和位置時才使用。注意:使用turtle庫繪制圖形后應(yīng)調(diào)用turtle.done()函數(shù)聲明繪制結(jié)束。3.4.1創(chuàng)建畫布畫筆的設(shè)置包括畫筆屬性和畫筆狀態(tài)畫筆屬性函數(shù)pensize(width)|width()功能:設(shè)置畫筆的粗細(xì)。參數(shù):width指定畫筆的寬度,默認(rèn)時返回當(dāng)前畫筆寬度。pencolor()、fillcolor()功能:設(shè)置畫筆的顏色或填充顏色。參數(shù):默認(rèn)時返回當(dāng)前畫筆顏色或當(dāng)前填充顏色。上面兩個函數(shù)的參數(shù)值有以下幾種表示方式。字符串:表示顏色的字符串。如“red”,“yellow”,“green”等。(r,g,b):顏色對應(yīng)的RGB數(shù)值,有整數(shù)值和小數(shù)值2種。十六進(jìn)制顏色:如“#FFFFFF”。3.4.2設(shè)置畫筆畫筆的設(shè)置包括畫筆屬性和畫筆狀態(tài)畫筆屬性函數(shù)pencolor()、fillcolor()上面兩個函數(shù)的參數(shù)值有以下幾種表示方式。字符串:表示顏色的字符串。如“red”,“yellow”,“green”等。(r,g,b):顏色對應(yīng)的RGB數(shù)值,有整數(shù)值和小數(shù)值2種。十六進(jìn)制顏色:如“#FFFFFF”。3.4.2設(shè)置畫筆顏色字符串RGB整數(shù)值RGB小數(shù)值十六進(jìn)制白色white(255,255,255)(1,1,1)#FFFFFF黃色yellow(255,255,0)(1,1,0)#FFFF00藍(lán)色blue(0,0,255)(0,0,1)#0000FF黑色black(0,0,0)(0,0,0)#000000棕色brown(165,42,42)(0.65,0.16,0.16)#A22A2A紫色purple(160,32,240)(0.63,0.13,0.94)#A020F0青色cyan(0,255,255)(0,1,1)#00FFFF畫筆的設(shè)置包括畫筆屬性和畫筆狀態(tài)畫筆屬性函數(shù)color(color1,color2)功能:同時設(shè)置畫筆的顏色和填充顏色。參數(shù):pencolor的值為color1,fillcolor的值為color2。speed(speed)功能:設(shè)置畫筆的移動速度。參數(shù):speed取值范圍為[0,10]的數(shù),值越大,速度越快。值小于0.5或大于10,則速度設(shè)置為0(瞬間完成)。3.4.2設(shè)置畫筆畫筆的設(shè)置包括畫筆屬性和畫筆狀態(tài)畫筆狀態(tài)函數(shù)penup()|pu()|up()功能:抬起畫筆,之后移動畫筆不繪制形狀。參數(shù):無。pendown()|pd()|down()功能:落下畫筆,之后移動畫筆將繪制形狀。參數(shù):無。shape(name=None)功能:將turtle畫筆的形狀設(shè)置給給定名稱的形狀,參數(shù)為空時表示返回當(dāng)前turtle的形狀。參數(shù):name可取值為classic、turtle、arrow、square、circle和triangle等。3.4.2設(shè)置畫筆畫筆的設(shè)置包括畫筆屬性和畫筆狀態(tài)畫筆狀態(tài)函數(shù)當(dāng)落下畫筆時,通過畫筆的移動可以在畫布上繪制圖形。畫筆即小海龜,這時它可以向前、向后、向左、向右移動,海龜爬行時在畫布上留下的痕跡就是繪制的圖形。為了控制圖形的輸出位置,首先需要了解turtle的坐標(biāo)體系。turtle坐標(biāo)體系以畫布中心為原點(diǎn),以原點(diǎn)右側(cè)為x軸正方向,原點(diǎn)上方為y軸正方向。初始時,小海龜位于畫布正中央,此處坐標(biāo)為(0,0),默認(rèn)方向水平右方。3.4.3繪制圖形turtle庫中畫筆控制函數(shù)主要分為移動控制、角度控制、圖形繪制和圖形填充。移動控制forward(distance)|fd()功能:畫筆向前移動。參數(shù):distance表示畫筆移動的距離,單位為像素,可正、可負(fù),正數(shù)表示前進(jìn);負(fù)數(shù)表示后退。backward(distance)|bk()|back()功能:畫筆向后移動。參數(shù):distance可正、可負(fù),正數(shù)表示后退;負(fù)數(shù)表示前進(jìn)。goto(x,y)|setpos(x,y)功能:畫筆移動到畫布上指定的位置。參數(shù):x,y分別表示目標(biāo)位置的橫坐標(biāo)和縱坐標(biāo)。3.4.3繪制圖形turtle庫中畫筆控制函數(shù)主要分為移動控制、角度控制、圖形繪制和圖形填充。角度控制right(angle)|rt()功能:畫筆向右轉(zhuǎn)動,不移動。參數(shù):angle角度值,表示轉(zhuǎn)動的角度,與當(dāng)前方向有關(guān)??烧?、可負(fù),正數(shù)表示向右轉(zhuǎn)動;負(fù)數(shù)表示向左轉(zhuǎn)動。left(angle)|lt()功能:畫筆向左轉(zhuǎn)動,
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度環(huán)境污染治理與修復(fù)合同
- 2024年版建筑項目合同樣本
- 永磁同步電機(jī)的課程設(shè)計
- 企業(yè)建筑施工安全生產(chǎn)管理制度匯編
- 花瓶插花課程設(shè)計
- 中國石化安全風(fēng)險評估指導(dǎo)意見
- 部編版八年級《道德與法治》上冊同步練習(xí)(全冊,含答案)
- 系統(tǒng)文件監(jiān)控課程設(shè)計
- 網(wǎng)紅飲料制作課程設(shè)計
- 股市基金課程設(shè)計
- 醫(yī)療機(jī)構(gòu)資產(chǎn)負(fù)債表(通用模板)
- 廢舊鋰離子電池高值資源化回收利用項目環(huán)評報告書
- 審計英語詞匯大全講課教案
- JIS G3507-1-2021 冷鐓用碳素鋼.第1部分:線材
- 初二家長會ppt通用PPT課件
- 小學(xué)生家庭作業(yè)布置存在的誤區(qū)及改進(jìn)策略論文1
- 一元一次含參不等式教學(xué)設(shè)計83
- 生物醫(yī)學(xué)研究的統(tǒng)計學(xué)方法課后習(xí)題答案 2014 主編 方積乾
- 牛仔面料成本核算
- 加拿大礦業(yè)政策
- 客情關(guān)系的建立和維護(hù)
評論
0/150
提交評論