2017年8月16日 星期三

一起學 Python - 03 :判斷語句 if ... elif ... else 依學生分數判斷級距


在前面的章節我們看到很多次 if guess == 6: 的語句,並且我們解釋了比較運算子以及大略的解釋了條件判斷式 if ... else的概念。一開始我們就用到 if ... else 這種較需要進行理解的語句,為的是實現猜數字遊戲,藉此提高大家對於寫程式的趣味性,當時跟大家說有個概念即可,而在這篇將會更詳細的介紹此語句。

if ... else函數在生活上有一個很明確的概念,舉在一起學 Python - 00 :Python安裝 實現簡單猜數字遊戲就提過的例子而言

如果今天放晴,我們就出門;或(帶有否定意謂,也就是沒放晴),我們就不出門。 
一個判斷條件,以執行後續程式碼的概念。

if 條件:
 結果1
    結果2
else :
    結果3
 結果4


如果我們在條件成立後需要執行的不只有開門,而還有鎖門等等的事情,那我們就需要子區塊來幫忙,告訴Python當條件成立(或不成立)時,需要執行的程式碼不只有一行
與 C 語言不同,Python在if ... else等需要子區塊的時候,並不會使用大括弧 { } 來進行區隔,而是使用 TAB 鍵,此做法讓 Python 的程式碼版面更為簡潔。

結果1及結果2 的前方程式碼是對齊的,自動成為一個子區塊,當條件成立(True)時執行。
結果3及結果4 的前方程式碼也是對齊的,成為一個子區塊,而這時的子區塊是做為else的子區塊,當條件不成立(False)時執行。

紅字的部分轉變為程式碼

if 今天放晴 :
就 出門
就    鎖門
else:
就 不出門
就    看電視

很明顯的"今天放晴"是一個條件判斷。else則替代了若沒放晴(在此例中很明顯的知道,放晴不放晴是一個有跟無的概念,也就是要麻有要嘛沒有)

現在寫一個程式碼,架構為

if 條件:
 結果1
    結果2
else :
    結果3
 結果4

如前所述,當條件成立時(True)列印出文字結果1及結果2。在此我們就不用比較運算子來進行比較了,直接把條件的地方打上 True 或是 False 以驗證子區塊。


















然而有時候我們的條件判斷並不是這麼簡單,例如說
如果今天放晴,我們就出門;或如果陰天,我們就散步;或,我們就不出門。 
也就是接下來要介紹的 if ... elif ... else

在此我們用一個更有趣的例子,當時在教學影片上看到這例子時我覺得倍感親切阿 ... 想當初第一次學習C語言的時候在條件判斷的時候,用到的是一模一樣的例子 !!

也就是一個依學生分數來判斷這個學生成積級數的應用,程式碼如下

score = int(input('輸入成積: '))

if 100 >= score >= 85:
    print("A")
elif 85 > score >= 70:
    print("B")
elif 70 > score >= 60:
    print("C")
elif 60 > score >= 0:
    print("F")
else:
    print("Error !")

程式碼的第一行由之前學過的 input 函數主導,讓使用者輸入分數後回傳一個字串。然而在之前的寫法中我們會將得到的字串額外用一條指令進行強制轉型 int,在此我們將兩條語句合併成一條丟入變量 score 中,使程式更加簡潔。

然後程式進入第三行中的 if ... elif ... else 判斷語句
假設我們輸入 85 分,則在進入判斷語句後會馬上成立,列印文字 A,然後跳出整個 if ... elif ... else的架構。
假設我們輸入 60 分,則進入判斷語語句後會因為前兩個都不成立,而不被執行,直到 elif 70 > score >= 60: 判斷成立,列印文字 C,然後跳出整個 if ... elif ... else架構。


















由此我們可以發現兩件事

1. 當有某一條語句判斷成立(True),就會跳出if ... elif ... else架構,也就是說後方的判斷都不會被進行。

2. 判斷具有優先級的概念。因為程式是由上往下執行,假設我們將程式改為以下

score = int(input('輸入成積: '))

if 100 >= score >= 85:
    print("A")
elif 85 > score >= 70:
    print("B")
elif 80 > score >= 60:
    print("C")
elif 60 > score >= 0:
    print("F")
else:
    print("Error !")


第一個 elif 的判斷條件與第二個 elif 的判斷條件具有重疊,當我輸入75分時,兩個判斷語句都是滿足條件的,但因為 elif 85 > score >= 70 的程式碼會優先被執行,且執行對應的子區塊後會跳出整個 if ... elif ... else 架構,所以我們只會得到列印文字B的結果。