只要用三種控制結(jié)構(gòu)就可以描述清楚一個程序。這三種控制結(jié)構(gòu)分別是順序、選擇、循環(huán)。
7.1順序結(jié)構(gòu)
程序的流程如果是瀑布式的,即按照語句的先后順序依次執(zhí)行,就是順序結(jié)構(gòu)。以早晨去上班這件事為例,第一步起床穿衣;第二步洗漱;第三步吃早餐;第四步騎上小電摩去公司。四個步驟環(huán)環(huán)相扣,依次執(zhí)行,不可顛倒。
將早晨去上班這件事用流程圖描述如圖7-1:
圖7-1
可以看出,這四個步驟是按照時間的先后順序執(zhí)行的。在程序中,順序結(jié)構(gòu)的代碼是按照代碼先后次序執(zhí)行的。早期的有些編程語言是要求給每行代碼編上行號的,它的執(zhí)行是按照行號順序執(zhí)行的。Python中程序代碼沒有行號,寫在前面的代碼先執(zhí)行,寫在后面的代碼后執(zhí)行。
7.2選擇結(jié)構(gòu)
但是,早餐可以在家做,也可以到外面買,條件就是看時間充足不充足(譬如早上洗漱花費的時間太多,太懶沒按時起床等等)。那么該流程圖就需要加上一個條件判斷(時間是否充足),相應(yīng)的就有兩個分支(家里做早餐,外面買早餐)。流程如圖7-2所示:
圖7-2
圖7-2所示的流程圖中,“吃早餐”要么“在家做”,要么“外面吃”,只能選擇其中的一種情況,這就是選擇結(jié)構(gòu)。
在Python中,用if語句、if…else…語句和if…elif…else多分支語句來實現(xiàn)選擇結(jié)構(gòu),這三種分支語句也可以互相嵌套。
格式:if 表達(dá)式:
語句塊
例:假設(shè)有30分鐘以上的空閑時間,就可以做早餐??梢赃@樣用程序描述:
time=int(input("請輸入空閑時間的值:"))
if time>=30:
print("可以在家做早餐")
運行結(jié)果如下:
請輸入空閑時間的值:32
輸出結(jié)果為:可以在家做早餐
請輸入空閑時間的值:21
無輸出結(jié)果
從這個例子可以看出,如果條件time>=30成立,則輸出“可以在家做早餐”;當(dāng)條件time>=30不成立,則沒有輸出結(jié)果。這樣就有點尷尬了,沒有輸出結(jié)果,有時會被誤認(rèn)為程序沒有執(zhí)行。
為了解決這個
格式如下:
if 表達(dá)式:
語句塊1
else:
語句塊2
在if…else…語句中,無論條件表達(dá)式的結(jié)果如何,都會進(jìn)入下一個分支。
將上面的例子改造如下:
time=int(input("請輸入空閑時間的值:"))
if time>=30:
print("可以在家做早餐")
else:
print("需要在外面吃飯")
運行結(jié)果如下:
請輸入空閑時間的值:32
輸出結(jié)果為:可以在家做早餐
請輸入空閑時間的值:23
輸出結(jié)果為:需要在外面吃飯
可以看出,if…else語句與if語句相比,既可以處理滿足條件的情況,又可以處理不滿足條件的情況。
格式如下:
if 表達(dá)式1:
語句塊1
elif 表達(dá)式2:
語句塊2
elif 表達(dá)式3:
語句塊3
……
else:
語句塊n
如果我們把上面的例子改成“空閑時間是否大于等于30分鐘?滿足則在家做飯,不滿足時又分兩種情況:空閑時間多于10分鐘,就去買早餐,否則就餓著算了”,程序代碼更改如下:
time=int(input("請輸入空閑時間的值:"))
if time>=30:
print("可以在家做早餐")
elif time>10:
print("需要在外面吃飯")
else:
print("餓著算了吧")
運行結(jié)果如下:
請輸入空閑時間的值:33
輸出結(jié)果:可以在家做早餐
請輸入空閑時間的值:23
輸出結(jié)果:需要在外面吃飯
請輸入空閑時間的值:8
輸出結(jié)果:餓著算了吧
7.3循環(huán)結(jié)構(gòu)
如果每周上5天班,那么每天早上的情況都是一樣的,只要描述玩星期一的活動情況,再加上一句“從周一到周五,天天如此”就可以了。這種反復(fù)做同一件事的情況,就是循環(huán)。程序代碼中有一段代碼需要反復(fù)執(zhí)行,那么,可以將這段代碼看成一個整體,被稱為循環(huán)體,而將循環(huán)的次數(shù)或者終止條件稱為循環(huán)結(jié)構(gòu)。
將圖7-2中的部分程序作為循環(huán)體,再加上循環(huán)控制結(jié)構(gòu),就形成了可以描述星期一到星期五每一天早晨上班的活動情況。見圖7-3。
Python中的循環(huán)結(jié)構(gòu)可以用while語句或for語句來實現(xiàn)。
1、while語句
在while循環(huán)中,起到重要作用的是條件表達(dá)式,如圖7-3中的n<=5。當(dāng)條件表達(dá)式的返回值為真時,則執(zhí)行循環(huán)體中的語句,執(zhí)行完畢后,重新判斷條件表達(dá)式的返回值,直到表達(dá)式的返回值為假時,退出循環(huán)。
對于圖7-3所描述的問題可以用while語句解決,代碼如下:
n=1
while n<=5:
time=int(input("請輸入空閑時間的值:"))
if time>=30:
print("可以在家做早餐")
else:
print("需要在外面吃飯")
n+=1
程序運行結(jié)果如下:
請輸入空閑時間的值:21
輸出結(jié)果為:需要在外面吃飯
請輸入空閑時間的值:32
輸出結(jié)果為:可以在家做早餐
請輸入空閑時間的值:12
輸出結(jié)果為:需要在外面吃飯
請輸入空閑時間的值:21
輸出結(jié)果為:需要在外面吃飯
請輸入空閑時間的值:43
輸出結(jié)果為:可以在家做早餐
可以看出,在條件表達(dá)式n<=5中,變量n是控制循環(huán)體執(zhí)行次數(shù)的關(guān)鍵,變量n的初值為1,保證了第一次運行程序時可以進(jìn)入循環(huán)體。如果程序要讓程序終止(即不再進(jìn)入循環(huán)體),必須使表達(dá)式n<=5不成立,即n>5。由于語句n+=1包含在循環(huán)體內(nèi),每執(zhí)行一次循環(huán)體,n的值才能增加1。要使n>5,就要執(zhí)行5次循環(huán)體。從運行結(jié)果看,上述分析是完全正確的。
在用while語句編寫循環(huán)結(jié)構(gòu)的程序時,從表面上看是不用考慮循環(huán)次數(shù)的,實際上條件表達(dá)式及循環(huán)控制變量就已經(jīng)隱含了循環(huán)次數(shù)。
2、for語句
for循環(huán)是一種可以很直觀的看出循環(huán)次數(shù)的控制結(jié)構(gòu)。語法格式如下:
for 迭代變量 in 對象:
循環(huán)體
其中,迭代變量用于保存讀取出的值;對象可以是任意有序的序列對象,如字符串、列表和元組等(列表和元組都是python中可以使用的數(shù)據(jù)類型,后面將會介紹)。
字符串“編程其實很簡單”其實是由7個字符構(gòu)成的序列,其中的每一個字符都可以通過命令取出。為了證明這個猜想,可以試著運行一下如下程序:
string="編程其實很簡單"
print(string)
for ch in string:
print(ch,end=' ')
運行結(jié)果如下:
編程其實很簡單
編 程 其 實 很 簡 單
其中,第一個print()語句輸出字符串string,第二個print()語句為輸出字符串string中的每一個字符(元素)。end=’ ’的含義是分隔符為一個空格,省略end表示用換行的方式進(jìn)行分隔。
圖7-3
3、跳轉(zhuǎn)語句break和continue
break可以使循環(huán)提前結(jié)束,而continue僅僅提前結(jié)束本趟循環(huán),轉(zhuǎn)入下一趟。打個比方:把鬧鐘的電池卸掉,讓指針不再轉(zhuǎn)圈,就好比break;通過手動方式,把指針調(diào)到0刻度,只是少轉(zhuǎn)了半圈,但接下來都正常,就好比continue。
我們把上面“吃早餐”的那個例子的條件修改一下:時間段改為從星期一到星期天,星期四出差,星期六、星期天休息。程序?qū)⑿薷臑槿缦麓a:
n=1
while n<=7:
if n==4:
print("星期"+str(n)+"出差")
n+=1 #第一個n+=1語句
continue
if n<6:
time=int(input("請輸入空閑時間的值:"))
if time>=30:
print("星期"+str(n)+"可以在家做早餐")
elif time>10:
print("星期"+str(n)+"需要在外面吃飯")
else:
print("星期"+str(n)+"餓著算了吧")
else:
print("星期"+str(n)+"休息")
break
n+=1 #第二個n+=1語句
運行結(jié)果如下:
請輸入空閑時間的值:21
星期1需要在外面吃飯
請輸入空閑時間的值:12
星期2需要在外面吃飯
請輸入空閑時間的值:4
星期3餓著算了吧
星期4出差
請輸入空閑時間的值:32
星期5可以在家做早餐
星期6休息
從上面的運行結(jié)果來看,當(dāng)變量n=4時,輸出了“星期4出差”,也執(zhí)行了第一個n+=1語句,但未執(zhí)行第二個n+=1語句(如果兩個都執(zhí)行了,那么就不會出現(xiàn)星期五的情況)。這進(jìn)一步驗證了continue只會提前結(jié)束一趟循環(huán),下一趟循環(huán)還會繼續(xù)。
只出現(xiàn)了“星期6休息”,沒有出現(xiàn)星期天的信息,可以看出,變量n的值未達(dá)到7,在變量n=6時循環(huán)就提前結(jié)束了。所以,break可以使循環(huán)全部終止。
]]>