- 機(jī)器學(xué)習(xí):基于OpenCV和Python的智能圖像處理
- 高敬鵬 江志燁 趙娜
- 2883字
- 2020-06-04 18:30:29
2.4 選擇與循環(huán)
在Python中,選擇與循環(huán)都是比較重要的控制流語句。選擇結(jié)構(gòu)可以根據(jù)給定的條件是否滿足來決定程序的執(zhí)行路線,這種執(zhí)行結(jié)構(gòu)在求解實際問題時被大量使用。根據(jù)程序執(zhí)行路線的不同,選擇結(jié)構(gòu)又可以分為單分支、雙分支和多分支三種類型。要實現(xiàn)選擇結(jié)構(gòu),就要解決條件表示問題和結(jié)構(gòu)實現(xiàn)問題。而循環(huán)結(jié)構(gòu)也是類似,需要有循環(huán)的條件和循環(huán)所執(zhí)行的程序(即循環(huán)體)。
2.4.1 if語句
最常見的控制流語句是if語句。if語句的子句即if語句在條件成立時所要執(zhí)行的程序,它將在語句的條件為True時執(zhí)行。如果條件為False,那么將跳過子句。
1. if單分支結(jié)構(gòu)
在Python中,if語句可以實現(xiàn)單分支結(jié)構(gòu),其一般的格式為:
if 表達(dá)式(條件): 語句塊(子句)
其執(zhí)行過程如圖2-1所示。

圖2-1 單分支if語句執(zhí)行過程
例如,判斷一個人的名字是否為“xiaoming”:
>>>if name == "xiaoming": >>> print ("he is xiaoming")
2. if雙分支結(jié)構(gòu)
在Python中,if子句后面有時也可以跟else語句。只有if語句的條件為False時,else子句才會執(zhí)行。
if語句同樣可以實現(xiàn)雙分支結(jié)構(gòu),其一般格式為:
if 表達(dá)式(條件): 語句塊1(if子句) else: 語句塊2(else子句)
其執(zhí)行過程如圖2-2所示。

圖2-2 雙分支if語句執(zhí)行過程
回到上面的例子,當(dāng)名字不是“xiaoming”時,else關(guān)鍵字后面的縮進(jìn)代碼就會執(zhí)行。
>>>if name =="xiaoming": >>> print ("he is xiaoming") >>>else: >>> print("he is not xiaoming")
3. if多分支結(jié)構(gòu)
雖然只有if或else子句會被執(zhí)行,但當(dāng)希望有更多可能的子句中有一個被執(zhí)行時,elif語句就派上用場了。elif語句是“否則如果”,總是跟在if或另一條elif語句后面。它提供了另一個條件,僅在前面的條件為False時才檢查該條件。
if語句也可以實現(xiàn)多分支結(jié)構(gòu),它的一般格式為:
if表達(dá)式1(條件1): 語句塊1 elif表達(dá)式2(條件2):
語句塊2 elif表達(dá)式3(條件3): 語句塊3 …… elif表達(dá)式m(條件m): 語句塊m [else: 語句塊n]
其執(zhí)行過程如圖2-3所示。

圖2-3 多分支if語句執(zhí)行過程
回到上面的例子。當(dāng)判斷名字是否為“xiaoming”之后,結(jié)果為False,還想繼續(xù)判斷其他條件,此時就可以使用elif語句。
>>>if name =="xiaoming": >>> print ("he is xiaoming") >>>elif age > 18 >>> print("he is an adult")
當(dāng)name == "xiaoming"為False時,會跳過if的子句轉(zhuǎn)而判斷elif的條件,當(dāng)age>18為True時,會輸出“he is an adult”。當(dāng)然,如果還有其他條件,可以在后面繼續(xù)增加elif語句,但是,一旦有一個條件滿足,程序就會自動跳過余下的代碼。下面分析一個完整的實例。
【例2-1】 學(xué)生成績等級判定。
輸入學(xué)生的成績,90分以上為優(yōu)秀,80~90分之間為良好,60~80分為及格,60分以下為不及格。程序代碼如下:
score=float(input("請輸入學(xué)生成績:"))#input Python內(nèi)置函數(shù) # if多支結(jié)構(gòu),判斷輸入學(xué)生成績屬于哪一級 ifscore>90: print("優(yōu)秀") elif score > 80: print("良好") elifscore>60: print("及格")
else:
print("不及格")
程序的一次運行結(jié)果如圖2-4所示。

圖2-4 學(xué)生成績等級判定結(jié)果1
另外一次的運行結(jié)果如圖2-5所示。

圖2-5 學(xué)生成績等級判定結(jié)果2
2.4.2 while循環(huán)
while循環(huán)結(jié)構(gòu)是通過判斷循環(huán)條件是否成立來決定是否要繼續(xù)進(jìn)行循環(huán)的一種循環(huán)結(jié)構(gòu),它可以先判斷循環(huán)的條件是否為True,若為True則繼續(xù)進(jìn)行循環(huán),若為False,則退出循環(huán)。
1. while語句基本格式
在Python中,while語句的一般格式為:
while表達(dá)式(循環(huán)條件): 語句塊
在Python中while循環(huán)的執(zhí)行過程如圖2-6所示。

圖2-6 while循環(huán)結(jié)構(gòu)
while語句會先計算表達(dá)式的值,判定是否為True,如果為True,則重復(fù)執(zhí)行循環(huán)體中的代碼,直到結(jié)果為False,退出循環(huán)。
注意 在Python中,循環(huán)體的代碼塊必須用縮進(jìn)對齊的方式組成語句塊。
【例2-2】 利用while循環(huán)求1~99的數(shù)字和。
i = 1 sum_all = 0 while i <=100: #當(dāng)i<=100時,條件為True,執(zhí)行循環(huán)體的語句塊 sum_all += i #對i進(jìn)行累加 i += 1 # i每次循環(huán)都要+1,這也是循環(huán)退出的條件 print(sum_all) #輸出累加的結(jié)果 運行結(jié)果為:4950
注意 在使用while語句時,一般情況下要在循環(huán)體內(nèi)定義循環(huán)退出的條件,否則會出現(xiàn)死循環(huán)。
【例2-3】 死循環(huán)演示。
num1= 10
num2 = 20
while num1 < num2:
print("死循環(huán)")
程序的運行結(jié)果如圖2-7所示。

圖2-7 死循環(huán)演示結(jié)果
可以看出程序會持續(xù)輸出“死循環(huán)”。
2. while語句中的else語句
在Python中可以在while語句之后使用else語句。在while語句的循環(huán)體正常循環(huán)結(jié)束退出循環(huán)后會執(zhí)行else語句的子句,但是當(dāng)循環(huán)用break語句退出時,else語句的子句則不會被執(zhí)行。
【例2-4】 while…else語句實例演示。
i =1 while i < 6: print(i, "< 6") i+=1 #循環(huán)計數(shù)作為循環(huán)判定條件 else: print(i,"不小于6")
程序的運行結(jié)果如圖2-8所示。

圖2-8 while…else運行結(jié)果1
當(dāng)程序改為如下代碼時:
i=1 whilei<6: print(i, "< 6") i+=1#循環(huán)計數(shù)作為循環(huán)判定條件 ifi==5:#當(dāng)i=5時,循環(huán)結(jié)束 break else: print(i, "不小于 6")
程序的運行結(jié)果如圖2-9所示。

圖2-9 while…else運行結(jié)果2
可以看出,當(dāng)i=5時程序跳出循環(huán),并不會執(zhí)行else下面的語句塊。
2.4.3 for循環(huán)
當(dāng)想要在程序中實現(xiàn)計數(shù)循環(huán)時,一般會采用for循環(huán)。在Python中,for循環(huán)是一個通用的序列迭代器,可以遍歷任何有序序列對象中的元素。
1. for循環(huán)的格式
for循環(huán)的一般格式為:
for 目標(biāo)變量 in 序列對象: 語句塊
for語句定義了目標(biāo)變量和需要遍歷的序列對象,接著用縮進(jìn)對齊的語句塊作為for循環(huán)的循環(huán)體。其具體執(zhí)行過程如圖2-10所示。

圖2-10 for循環(huán)執(zhí)行結(jié)構(gòu)
for循環(huán)首先將序列中的元素依次賦給目標(biāo)變量,每賦值一次都要執(zhí)行一次循環(huán)體的代碼。當(dāng)序列的每一個元素都被遍歷之后,循環(huán)結(jié)束。
2. range在for循環(huán)中的應(yīng)用
for循環(huán)經(jīng)常和range聯(lián)用。range是Python 3.x內(nèi)部定義的一個迭代器對象,可以幫助for語句定義迭代對象的范圍。其基本格式為:
range(start, stop[, step])
range的返回值從start開始,以step為步長,到stop結(jié)束,step為可選參數(shù),默認(rèn)為1。
【例2-5】 for循環(huán)與range的聯(lián)用。
for i in range(1,10):
print(i, end=' ') # end=表示輸出結(jié)果不換行
輸出結(jié)果如圖2-11所示。

圖2-11 for循環(huán)運行結(jié)果1
參數(shù)改為間隔輸出:
for i in range(1,10,2): print(i, end=' ')
輸出結(jié)果如圖2-12所示。

圖2-12 for循環(huán)運行結(jié)果2
【例2-6】 利用for循環(huán)求1~100中所有可以被4整除的數(shù)的和。
sum_4 =0 foriinrange(1,101):#for循環(huán),范圍為1~100 ifi%4==0:#判定能否被4整除 sum_4 +=i print("1~100內(nèi)能被4整除的數(shù)和為:", sum_4)
程序輸出結(jié)果如圖2-13所示。

圖2-13 整除顯示結(jié)果
2.4.4 break和continue語句
break語句和continue語句都是循環(huán)控制語句,可以改變循環(huán)的執(zhí)行路徑。
1. break語句
break語句多用于for、while循環(huán)的循環(huán)體,作用是提前結(jié)束循環(huán),即跳出循環(huán)體。當(dāng)多個循環(huán)嵌套時,break只是跳出最近的一層循環(huán)。
【例2-7】 使用break語句終止循環(huán)。
i =1 while i < 6: print("output number is ", i) i = i +1 #循環(huán)計數(shù)作為循環(huán)判定條件 if i == 3: # i=3時結(jié)束循環(huán) break print("輸出結(jié)束")
程序運行結(jié)果如圖2-14所示。

圖2-14 break終止循環(huán)顯示結(jié)果
【例2-8】 判斷所輸入的任意一個正整數(shù)是否為素數(shù)。
素數(shù)是指除1和該數(shù)本身之外不能被其他任何數(shù)整除的正整數(shù)。如果要判斷一個正整數(shù)n是否為素數(shù),只要判斷其是否可以被之間的任何一個正整數(shù)整除即可,如果不能整除則為素數(shù)。
import math n = int(input("請輸入一個正整數(shù):")) k = int(math.sqrt(n)) #求出輸入整數(shù)的平方根后取整 for i in range(2, k+2): if n % i ==0: #判斷是否被整除 break if i == k+1: print(n, "是素數(shù)") else: print(n, "不是素數(shù)")
程序的一次運行結(jié)果如圖2-15所示。

圖2-15 素數(shù)判斷運行結(jié)果1
程序的另一次運行結(jié)果如圖2-16所示。

圖2-16 素數(shù)判斷運行結(jié)果2
2. continue語句
continue語句類似于break語句,必須在for和while循環(huán)中使用。但是,與break語句不同的是,continue語句僅僅跳出本次循環(huán),返回到循環(huán)條件判斷處,并且根據(jù)判斷條件來確定是否繼續(xù)執(zhí)行循環(huán)。
【例2-9】 使用continue語句結(jié)束循環(huán)。
i =0 while i < 6: i = i +1 if i == 3: #當(dāng)i=3時,跳出本次循環(huán) continue print("output number is ", i) print("輸出結(jié)束")
程序運行結(jié)果如圖2-17所示。

圖2-17 continue跳出循環(huán)顯示結(jié)果
從圖2-17中的輸出結(jié)果可以看出,continue跳出了i=3時的循環(huán)。
【例2-10】 計算0~100之間不能被3整除的數(shù)的平方和。
sum_all = 0 for i in range(0,101): if i%3 ==0: continue #條件成立時,結(jié)束本次循環(huán) else: sum_all = sum_all + i** 2 print("平方和為:", sum_all)
程序運行結(jié)果如圖2-18所示。

圖2-18 平方和顯示結(jié)果
- 物聯(lián)網(wǎng)之云:云平臺搭建與大數(shù)據(jù)處理
- TensorFlow移動端機(jī)器學(xué)習(xí)實戰(zhàn)
- 人工智能+機(jī)器人入門與實戰(zhàn)
- AI自媒體寫作超簡單
- C#神經(jīng)網(wǎng)絡(luò)編程
- 人人都是設(shè)計師:設(shè)計基礎(chǔ)+Midjourney+ChatGPT
- AI虛擬仿真從入門到參賽
- 區(qū)塊鏈 人工智能 數(shù)字貨幣:黑科技讓生活更美好?
- 三維人臉建模方法研究與應(yīng)用
- 展望:人工智能,物我合一
- 人工不智能:計算機(jī)如何誤解世界(見識叢書52)
- 機(jī)器學(xué)習(xí)中的數(shù)學(xué)修煉
- 增強人類:技術(shù)如何塑造新的現(xiàn)實
- 人工智能哲學(xué)
- 智能語音處理