KT 的 Python 進階程式設計

W02|讓程式做決定:條件判斷

今天完成後,我可以

  1. 使用 if / elif / else 處理多種情況。
  2. 依照題目邊界寫出正確的比較條件。
  3. 使用條件判斷決定是否計算或修改變數。
  4. 知道 if 後面不一定要有 else。
  5. 分辨「兩個獨立的 if」與 if / elif 的不同。
  6. 使用暫時的 print() 檢查中間計算結果。
  7. 準備不同的測試資料檢查程式。

一、快速恢復條件判斷

下面的程式會讀入一個成績,並判斷是否及格:

Python 3圖片

執行程式前,先預測結果:

表格可左右滑動
輸入 條件 score >= 60 輸出
59 ____ ____
60 ____ ____
85 ____ ____

閱讀這段程式時,可以按照以下順序理解:

  1. if 後面寫要檢查的條件。
  2. 條件成立時,執行 if 下方縮排的程式。
  3. 條件不成立時,執行 else 下方縮排的程式。

請注意:

如果情況不只兩種,可以在 if 和 else 之間加入 elif:

語法示意圖片

Python 會由上往下檢查,遇到第一個成立的分支後,就不再執行後面的分支。接下來的 BMI 分類,就需要使用這種多分支判斷。

二、課中練習

2-1|b007 你過胖了嗎(70分)

先依下面的提醒自己試寫;約10分鐘後,教師會示範一種常見寫法與常見錯誤,再讓你補完程式。操作時記得:

BMI 公式如下,其中\(w\)代表以公斤計算的體重,\(h\)代表以公尺計算的身高:

\[ \mathrm{BMI}=\frac{w}{h^2} \]

輸入大分數時,先打骨架,再填入分子與分母:

公式/運算
() / ()
表格可左右滑動
BMI 輸出
\(\mathrm{BMI}<18.5\) 過輕
\(18.5\leq\mathrm{BMI}<24\) 健康
\(24\leq\mathrm{BMI}<27\) 過重
\(\mathrm{BMI}\geq27\) 肥胖

開始寫條件前,先預測三個邊界值:

表格可左右滑動
BMI剛好是 應輸出
18.5 ____
24 ____
27 ____

除錯:先檢查BMI算得對不對

第一次執行結果不正確時,可以在條件判斷前暫時加入:

Python 3圖片

完成後請測試不同分類,並特別檢查 18.5、24、27。

完成後整理:elif 已經排除了哪些情況?

elif只會在前面的條件都不成立時才檢查,因此不必再次寫出已被排除的下限。

例如成績等第若先檢查score >= 90,接著的elif score >= 80本身就代表「未滿90,而且至少80」,不必再重寫score < 90。

2-2|a363 早餐店結帳(30分)

早餐買一份主餐和一杯飲料,優惠方式如下:

請計算套用優惠後的結帳金額。

這題不在 if 中直接輸出,而是先分別調整價格,最後才加總輸出。

先預測結果:

表格可左右滑動
主餐原價 飲料原價 哪些品項有折扣 最後金額
50 40 ______ ____
51 40 ______ ____
50 41 ______ ____
60 45 ______ ____

指定敘述會先計算等號右邊,再把結果存回左邊的變數。例如:

Python 3圖片

第二行先用原本的price算出50,再把50存回price。下面骨架中的價格變數也會用相同方式更新。

提示:程式骨架
Python 3圖片

思考:

  1. 「超過」包含剛好等於門檻嗎?
  2. 兩項優惠能否同時成立?
  3. 為什麼這裡要用兩個 if,不能使用 if / elif?
提示:兩項優惠能同時成立嗎?

先分別調整主餐與飲料價格,再加總。兩項優惠可能同時成立,所以要使用兩個獨立的if。

三、條件判斷可以有不同用途

表格可左右滑動
題目 條件判斷負責什麼
b007 決定要輸出哪一種分類
a363 早餐店結帳 分別決定是否修改主餐與飲料價格
共同點 都要正確處理邊界及判斷順序

記住:if 可以決定輸出,也可以決定是否修改資料;不需要處理「其他情況」時,可以不寫 else。

四、課後挑戰:條件判斷的不同用法

表格可左右滑動
題目 配分 定位 解題前要注意
b028 恭喜你可以參加複試 15 分 基礎必做 條件不成立時,題目是否要求輸出?
b029 大雨大雨一直下 25 分 核心必做 從大到小或從小到大判斷,哪一種比較清楚?
a185 籃球明星賽 30 分 核心進階 每場比賽後,要修改哪一隊的勝場?
b008 決戰520 30 分 延伸挑戰 是否完整處理平手、A 勝與 B 勝?

4-1|b028 恭喜你可以參加複試

提示:條件不成立時,題目沒有要求輸出;不要自行增加文字。

測試不合格的範例時,畫面上沒有任何輸出才是正確的。

4-2|b029 大雨大雨一直下

提示:先確認題目的各個雨量範圍,再決定由大到小或由小到大判斷。特別檢查剛好位於分界的數值。

4-3|a185 籃球明星賽

提示:準備兩個變數記錄勝場;每場更新一次,最後再判斷總結果。

4-4|b008 決戰520

這題沒有唯一寫法。先確定沒有遺漏情況,再考慮程式長短。

提示一:先整理情況

先列出所有出拳組合,確認哪些是平手、A 獲勝或 B 獲勝。

提示二:決定判斷順序

可以先處理平手,再處理 A 獲勝的情況,其餘情況就是 B 獲勝。

提示三:選擇適合自己的寫法

你可以根據 A 出什麼使用巢狀 if,也可以使用 and、or 合併多組條件。

忘記多個條件的寫法時,可查閱常見語法表|組合多個條件。

五、完成後自我檢查