Learning Objectives
- Python 程式設計風格:敘述、註解,以及縮排的重要性
- 條件判斷式 if、if-else、if-elif-else 與巢狀 if 的用法
- 條件運算式(x if C else y)
讓程式做選擇
到目前為止,程式都是從第一行依序執行到最後一行。真實的問題常常要看情況決定: 分數不到 60 要提醒、年齡決定票價、輸入的數字是不是偶數。這就是條件判斷。
從本課開始,我們把程式寫成 .py 腳本檔,而不只是在互動式環境一行一行輸入。寫腳本有幾個基本規則:
| 規則 | 說明 |
|---|---|
| 一列一個敘述 | 用分號 ; 可以把多個敘述寫在同一列,但不建議常用 |
| 多列接續 | 一列太長可以用 \ 接到下一列;在 ( )、[ ]、{ } 裡面則可以直接換行 |
| 註解 | # 之後到列尾都是註解,習慣在 # 後空一格;Python 沒有多列註解,要每列各自加 # |
pass |
空敘述,什麼都不做;語法上需要一個區塊、但還沒想好要寫什麼時使用 |
第一支腳本:ex7_1.py
這是投影片的 ex7_1.py,再加上分號與多列接續的寫法。程式會讀到預先準備的輸入 Amy,你可以在下方改成自己的名字再跑一次。
縮排:Python 用空白表示區塊
很多語言用大括號 { } 包住一組敘述,Python 則是用縮排:
- 以關鍵字開頭、以冒號
:結尾的那一列(例如if、else、for),下一列開始要縮排,縮排的部分就是它的程式碼區塊。 - 同一個區塊的每一列,縮排的空格數必須完全一樣;縮排回到原本的位置,區塊就結束了。
- PEP 8 建議:每一層縮排用 4 個空白,不要用 Tab。
- 不可以沒有理由縮排:只有冒號的下一列才能開始縮排。
if True:
print('Answer')
print('True')
else:
print('Answer')
print('False') # 空格數和上一列不同:IndentationError
Python 不是自由格式的語言,空白有意義。縮排錯誤是初學者最常遇到的錯誤之一。
if 敘述:ifstmt1.py
輸入的分數是 45。注意執行箭頭:條件成立時進入第 5 行;第 7 行沒有縮排,不屬於 if,所以一定會執行。把下方的輸入改成 80 再跑一次,看箭頭怎麼跳過第 5 行。
條件不一定要是 True / False
if 後面可以放任何值,Python 會把它當成真或假來判斷。以下這些都視為假:
False、None、0、0.0、空字串 ""、空串列 []、空元組 ()、空字典 {}、空集合 set()
除此以外都視為真。所以 if name: 就是「name 不是空字串的話」的簡潔寫法。
if-else 敘述:ifstmt2.py
輸入 72。if 和 else 兩個區塊只會執行其中一個。後半段示範條件是 0 的情況:0 是假值,所以區塊被跳過。
if-elif-else 敘述:ifstmt3.py
輸入 16。Python 由上往下逐一檢查條件,找到第一個成立的就執行它,其餘全部跳過。想一想:如果把 age < 18 和 age < 13 的順序對調,輸入 10 會印出什麼?
想一想:縮排與真假值
下面的程式執行後會怎樣?
if True:
print("Answer")
print("True")
else:
print("Answer")
print("False")
下面的程式會印出什麼?
items = []
if items:
print("A")
else:
print("B")
巢狀 if
輸入 9。外層先判斷是不是偶數,內層再判斷能不能被 3 整除;每多一層 if,就多縮排一層。試著改輸入 12、8、7,讓箭頭走到四個不同的出口。
條件運算式:x if C else y
當 if-else 只是要「依條件決定一個值」時,可以寫成一列的條件運算式(又稱三元運算子):
result = x if C else y # C 成立得到 x,否則得到 y
它等於下面四列:
if C:
result = x
else:
result = y
條件運算式是所有 Python 運算子中優先順序最低的(只比 lambda 和 := 高)。
另外,if 區塊只有一個敘述時,也可以寫在同一列:if var == 50: print('Value is 50')(單一敘述套件)。
條件運算式:ifstmt4.py
輸入 26(超過 23)。第 4 行先算 h >= 24,成立就得到 h % 24,否則保持原本的 h。
追蹤條件判斷
下面的程式會印出什麼?
score = 85
if score >= 60:
print("C")
elif score >= 80:
print("B")
else:
print("F")
下面的程式會印出什麼?
x = 7
print("odd" if x % 2 else "even")
下面的程式會印出什麼?
n = 10
if n > 5:
if n > 20:
print("A")
else:
print("B")
else:
print("C")
下面的程式會印出什麼?
h = 30
h = h % 24 if h >= 24 else h
print(h)
實作:分數轉等第
程式會讀入一個分數(下方輸入是 78)。請完成兩個 TODO:用 if-elif-else 決定等第(90 以上 A、80 以上 B、70 以上 C、60 以上 D、其他 F),再用條件運算式印出「及格」或「不及格」。完成後可以改輸入的分數多試幾次。
重點精華回顧
- Python 腳本的特性:一列一個敘述;
#是註解;冒號結尾的下一列要縮排,同一個區塊的縮排必須一致(建議 4 個空白)。 - if:條件成立才執行區塊;if-else:二選一;if-elif-else:由上往下,只執行第一個成立的區塊。
- 條件可以是任何值:
0、None、空字串、空容器都是假,其他都是真。 - 巢狀 if:if 的區塊裡還有 if,每多一層就多縮排一層。
- 條件運算式
x if C else y:依條件得到兩個值之一,適合取代只為了指派一個值的 if-else。