官术网_书友最值得收藏!

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é)生成績:"))#inputPython內(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é)果

主站蜘蛛池模板: 高雄县| 湛江市| 大田县| 安溪县| 麻栗坡县| 邵武市| 双柏县| 长沙市| 贡觉县| 阿鲁科尔沁旗| 和政县| 车致| 龙陵县| 西宁市| 崇信县| 潮安县| 洮南市| 大田县| 宝山区| 弥渡县| 桐梓县| 永宁县| 饶平县| 崇义县| 灌阳县| 仙居县| 子洲县| 红安县| 新巴尔虎右旗| 横山县| 临汾市| 肥城市| 长宁区| 平邑县| 兴隆县| 临澧县| 周口市| 霸州市| 白水县| 当阳市| 扎赉特旗|