Python 入門指南 5.0
單元 6 - 選擇
程式中的選擇 (selection) 就是依條件 (condition) 使程式有不同的執行方向,若條件為真,也就是 True ,程式就會跳過 False 的部份執行 True 的部份,反之亦然
pass
elif condition2:
pass
else:
pass
選擇結構有單一選擇跟多重選擇,兩者都使用 if 陳述 (if statement) , if 為關鍵字 (keyword) 之一,若是多重選擇 if 須與 elif 或 else 連用。單一選擇,也就是單獨使用 if 陳述如下
1 2 3 4 5 6 7 8 9 10 11 12 | # 單一 if 陳述
if 3 > 5:
# 條件為真印出以下訊息
print("什麼!三居然大於五!")
# if 陳述結束後執行
print("if 陳述後執行的部分")
# 檔名: if_demo01.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
執行結果如下
$ python if_demo01.py |
if 陳述後執行的部分 |
$ |
條件為 if 後面到冒號的範圍,上例為 3 大於 5 ,如果 3 大於 5 為真,程式就會執行條件後縮排 (indentation) 的程式區塊 (block) ,其範圍一直到沒有縮排為止,這裡就可以看到 Python 裡頭縮排的意義。如果 3 大於 5 為假,程式自然跳過條件後的程式區塊,去找區塊後的第一個陳述 (statement) 執行。
if 與 else 連用,條件為真,執行 if 後的程式區塊,條件為假,就執行 else 後的程式區塊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # if-else 陳述
if 3 > 5:
# 條件為真印出以下訊息
print("什麼!三居然大於五!")
else:
# 條件為假印出以下訊息
print("還好,三沒有大於五!")
# if-else 陳述結束後執行
print("if 陳述後執行的部分")
# 檔名: if_demo02.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
執行結果如下
$ python if_demo02.py |
還好,三沒有大於五! |
if 陳述後執行的部分 |
$ |
elif 表示其他的條件,形成 if-elif-else 的多重選擇,最後的 else 表示以上皆非
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # if-else 陳述
if 3 > 5:
# 符合 3 > 5 的條件印出以下訊息
print("什麼!三居然大於五!")
elif 4 > 5:
# 符合 4 > 5 的條件印出以下訊息
print("什麼!四居然大於五!")
elif 5 > 5:
# 符合 5 > 5 的條件印出以下訊息
print("什麼!五居然大於五!")
elif 6 > 5:
# 符合 6 > 5 的條件印出以下訊息
print("六當然大於五!")
else:
# 沒有符合以上任何條件印出以下訊息
print("沒有符合的條件!")
# if-else 陳述結束後執行
print("if 陳述後執行的部分")
# 檔名: if_demo03.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
以上範例執行結果如下
$ python if_demo03.py |
六當然大於五! |
if 陳述後執行的部分 |
$ |
C-Style 的程式語言中,另有一種依據常數進行的選擇結構,這在 Python 同樣可以用 if-elif-else 的多重選擇來進行,由於 Python 發明之初便以簡單為哲學,因此早期是用 if-elif-else 實現這項功能。
舉一例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # 設定變數 s
s = 6
# if-else 陳述
if s == 3:
# 符合 s == 3 的條件印出以下訊息
print("3...")
elif s == 4:
# 符合 s == 4 的條件印出以下訊息
print("4...")
elif s == 5:
# 符合 s == 5 的條件印出以下訊息
print("5...")
elif s == 6:
# 符合 s == 6 的條件印出以下訊息
print("6...")
else:
# 沒有符合以上任何條件印出以下訊息
print("沒有符合的條件!")
# if-else 陳述結束後執行
print("if 陳述後執行的部分")
# 檔名: switch_demo.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
這裡的條件為判斷某一變數 (variable) 是否符合某一常數 (constant) ,執行結果如下
$ python select_demo.py |
6... |
if 陳述後執行的部分 |
$ |
Python 在 3.10 加入 match-case 陳述實現這種多重選擇,上例改寫如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 設定變數 s
s = 6
# match-case 陳述
match s:
case 3:
# 符合 s == 3 的條件印出以下訊息
print("3...")
case 4:
# 符合 s == 4 的條件印出以下訊息
print("4...")
case 5:
# 符合 s == 5 的條件印出以下訊息
print("5...")
case 6:
# 符合 s == 6 的條件印出以下訊息
print("6...")
case _:
# 沒有符合以上任何條件印出以下訊息
print("沒有符合的條件!")
# match-case 陳述結束後執行
print("match 陳述後執行的部分")
# 檔名: match_demo.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
執行結果如下
$ python match_demo.py |
6... |
match 陳述後執行的部分 |
$ |
第 4 行,關鍵字 match 後面接要做為選擇的變數 s , s 在第 2 行已經設定為整數 6
4 | match s:
|
下面每個 case 提供不同的常數選項,只要遇到跟 s 有相同值的選項就會執行底下縮排的程式碼,注意到最後一個 case 為底線 _
17 18 19 | case _:
# 沒有符合以上任何條件印出以下訊息
print("沒有符合的條件!")
|
底線 _ 在這裡是當關鍵字使用,當作通用字元 (wildcard) ,表示符合各種狀況。
case 之後到冒號前可以再加上 if 陳述,使該 case 符合特定條件才執行底下程式碼。
複合陳述 (compound statement) 除了選擇結構 (selection structure) 還有重複結構 (repetition structure) ,重複結構也被稱為迴圈 (loop) ,接下來我們就進入討論迴圈的部份。
中英文術語對照 | |
---|---|
程式區塊 | block |
複合陳述 | compound statement |
條件 | condition |
常數 | constant |
if 陳述 | if statement |
縮排 | indentation |
關鍵字 | keyword |
迴圈 | loop |
重複結構 | repetition structure |
選擇 | selection |
選擇結構 | selection structure |
通用字元 | wildcard |
陳述 | statement |
變數 | variable |
重點整理 |
---|
1. 單一的 if 陳述,條件為真時就會執行 if 底下縮排的區塊。 |
2. 縮排長度通常用 2 到 5 個空格,我們採用 3 個空格。 |
3. if-else 陳述,條件為真時就會執行 if 底下縮排的區塊,反之執行 else 底下縮排的區塊。 |
4. if-elif-else 陳述,視哪一個條件為真時就執行該縮排的區塊,如果都不為真,就會執行 else 縮排的區塊, else 就是以上皆為非的情況。 |
5. match-case 是 Python 新加入的多重選擇的陳述,在 match 後接要選擇的常數,底下 case 接各種選項,哪一項 case 符合 match 後的常數就會執行該 case 底下的程式碼, case 的最後的選項可以用底線,作為以上皆非的選項。 |
問題與討論 |
---|
1. 縮排的格數有什麼重要性?超過 5 格或只用 1 格有什麼優缺點? |
2. 其他程式語言通常提供兩種以上的選擇結構,為什麼 Python 只有一種? |
3. elif 陳述的個數有限制嗎? |
4. 為什麼要加入 match-case 陳述,只用 if-elif-else 陳述有什麼缺點? |
練習 |
---|
1. 寫一個程式 exercise0601.py ,建立兩個變數 a 及 b ,並將 a 設定為 3 , b 設定為 5 ,利用 if 陳述判斷兩者大小,並且印出哪一個變數比較大。 參考程式碼 |
2. 承上題,另寫一個程式 exercise0602.py ,改成接受使用者輸入。 參考程式碼 |
3. 承上題,另寫一個程式 exercise0603.py ,改成判斷是否相等。 參考程式碼 |
4. 承上題,另寫一個程式 exercise0604.py ,改成判斷是否不相等。 參考程式碼 |
5. 承上題,另寫一個程式 exercise0605.py ,改成將 b 設定為固定值,例如 10 做為答案,然後使用者輸入的 a 進行猜測,先用 and 連接 a != b 及 a > b 判斷答案是否比較小,再利用 a != b 及 a < b 判斷答案是否比較大,最後 else 則是印出兩者相等。 參考程式碼 |
6. 寫一個程式 exercise0606.py ,先用 if 判斷 [] 、 "" 或 {} 是否為真,接著用 elif 判斷 None 是否為真,再用 elif 判斷 0 或 0.0 是否為真,最後 else 的部分印出「以上皆非」 參考程式碼。 |
7. 寫一個程式 exercise0607.py ,先用 if not 判斷 True ,如果為真印出 not True ,再用 if not 判斷 False ,如果為真印出 not False 。 參考程式碼 |
8. 寫一個程式 exercise0608.py ,先用變數 score 接受使用者輸入的分數,然後用 if-elif-else 判斷分數為 100 、 90~99 、 80~89 、 70~79 、 60~69 及 60 以下的區間,依序印出 "Perfect!" 、 "Excellent!" 、 "Great!" 、 "Good!" 、 "Not Bad!" 、 "Bad!" 等訊息,注意判斷數字區間可以用 and 連接 score < 100 及 score >= 90 或直接用 90 <= score < 100 ,最後如果輸入的分數不在 0 到 100 的範圍就印出 "That's impossible!!" 。 參考程式碼 |
9. 承上題,另寫一個程式 exercise0609.py ,改成用 match-case 陳述,注意 case 之後可以改成變數,然後用 if 判斷變數範圍。 參考程式碼 |
10. 承上題,另寫一個程式 exercise0610.py ,改成直接用數字,注意可以用 | 連接數字,這是或的意思。 參考程式碼 |
11. 寫一個程式 exercise0611.py ,先設定序對變數 point 例如 (4, 0) 當座標點,然後利用 match-case 判斷 point 在原點、 X 軸、 Y 軸還是非軸線上。 參考程式碼 |