更新時間:2022-10-14 來源:黑馬程序員 瀏覽量:
利用二分支結構對程序進行改動,在一定程度上降低了代碼冗余,提高了程序效率。然而,表面看來程序得到了優(yōu)化,實際上改動后的程序出現(xiàn)了一個致命缺陷——程序邏輯存在問題:只要接收的輸入不是1~5,程序總會判定“今天非工作日。”。
如此看來,第2個判斷條件不應被省略,但能否將判斷結構間的并列關系改為互斥關系呢?答案是肯定的。
Python中提供了多分支結構:if-elif-else。多分支結構可連接多個判斷條件,產生多個分支,但各個分支間存在互斥關系,最終至多有一個分支被執(zhí)行。多分支結構的語法格式如下:
i£判斷條件1: 代碼段1 elif判斷條件2: 代碼段2 ... elif判斷條件n: 代碼段n else: 代碼段n+1
多分支結構中的if、elif、else、“:”和代碼段前的縮進都是語法的一部分,if語句、每一個elif語句和else語句都是一個分支,其后的代碼段通過縮進與其產生邏輯聯(lián)系。進入多分支結構后先判斷語句中的條件,若滿足則執(zhí)行代碼段1后跳出分支結構;若不滿足則繼續(xù)判斷elif語句中的條件,在滿足條件時執(zhí)行相應代碼段;若所有條件都不滿足,執(zhí)行else語句之后的代碼段。多分支結構的流程圖如下圖所示。
使用多分支結構實現(xiàn)判斷當天是否為工作日的程序,完整代碼如下:
#07_working_day_elif.py day = int ( input("今天是工作日嗎(請輸入整數(shù)1~7)?") ) if day in [1,2,3,4,5]: print(”今天是工作日?!? elif day in [6,7]: pxint(“今天非工作日?!? else: print("輸人有誤?!?
以上程序根據輸入進行判斷,若輸入為1~5,判定當天是工作日;若輸入為6、7,判定當天非工作日;若輸人為其他,提示“輸入有誤”。
多分支結構中條件較多,各分支為互斥關系,每個多分支結構中只有一段代碼會被執(zhí)行,但判斷條件可能存在包含關系,此時需要注意判斷條件的先后順序。例如實現(xiàn)一個這樣的程序:根據輸入的百分制成績輸出由A~E表示的五分制成績。此時很容易寫出如下代碼:
#08_grade_conversion.py score = eval(input(“請輸入百分制成績:“)) if score > 60.0: grade = "D" elif score > 70.0: grade = "C" elif score > 80.0: grade = "B" elif score > 90.0: grade ="A" else: grade = "E" print(”對應的五分制成績是:()".format (grade ) )
以上程序依次將60.0、70.0、80.0、90.0作為成績的臨界點,若百分制成績高于60.0,五分制成績?yōu)镈;若百分制成績高于70.0,五分制成績?yōu)镃;以此類推。執(zhí)行以上程序,輸入百分制成績75,執(zhí)行結果如下:
請輸人百分制成績:75 對應的五分制成績是:D
以上程序雖能正常運行,但運行結果卻不符合預期,這顯然是因為代碼的邏輯存在問題。分析筏碼,我們會注意到高于70.0、80.0、90.0的成績必然高于60.0,因此只要輸入的成績高于60.0,程序總是執(zhí)行if條件之后的代碼段,輸出的五分制成績總是D。修改代碼,修正程序邏輯結構,修改后的代碼如下:
#09_grade_conversion_change_order.py score=eval(input("”請輸入百分制考試成績:")) if score > 90.0: grade = "A" elif score > 80.0: grade = "B" elif score > 70.0: grade = "C" elif score > 60.0: grade = "D" else: grade = "E" print("對應的五分制成績是:{}".format(grade) )
綜上可知,判斷條件是分支結構的核心,條件決定程序的流向,當分支中的條件存在包含關系時,條件的先后順序同樣影響程序的邏輯,因此,在使用分支結構時應。