Python 入門指南 5.0

單元 6 - 選擇

~~學習進度表~~

程式中的選擇 (selection) 就是依條件 (condition) 使程式有不同的執行方向,若條件為真,也就是 True ,程式就會跳過 False 的部份執行 True 的部份,反之亦然

if condirion1:
    pass
elif condition2:
    pass
else:
    pass

選擇結構有單一選擇跟多重選擇,兩者都使用 if 陳述 (if statement) , if 為關鍵字 (keyword) 之一,若是多重選擇 if 須與 elifelse 連用。單一選擇,也就是單獨使用 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) 執行。

ifelse 連用,條件為真,執行 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 後面接要做為選擇的變數 ss 在第 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 ,建立兩個變數 ab ,並將 a 設定為 3b 設定為 5 ,利用 if 陳述判斷兩者大小,並且印出哪一個變數比較大。 參考程式碼
2. 承上題,另寫一個程式 exercise0602.py ,改成接受使用者輸入。 參考程式碼
3. 承上題,另寫一個程式 exercise0603.py ,改成判斷是否相等。 參考程式碼
4. 承上題,另寫一個程式 exercise0604.py ,改成判斷是否不相等。 參考程式碼
5. 承上題,另寫一個程式 exercise0605.py ,改成將 b 設定為固定值,例如 10 做為答案,然後使用者輸入的 a 進行猜測,先用 and 連接 a != ba > b 判斷答案是否比較小,再利用 a != ba < b 判斷答案是否比較大,最後 else 則是印出兩者相等。 參考程式碼
6. 寫一個程式 exercise0606.py ,先用 if 判斷 []""{} 是否為真,接著用 elif 判斷 None 是否為真,再用 elif 判斷 00.0 是否為真,最後 else 的部分印出「以上皆非」 參考程式碼
7. 寫一個程式 exercise0607.py ,先用 if not 判斷 True ,如果為真印出 not True ,再用 if not 判斷 False ,如果為真印出 not False參考程式碼
8. 寫一個程式 exercise0608.py ,先用變數 score 接受使用者輸入的分數,然後用 if-elif-else 判斷分數為 10090~9980~8970~7960~6960 以下的區間,依序印出 "Perfect!""Excellent!""Great!""Good!""Not Bad!""Bad!" 等訊息,注意判斷數字區間可以用 and 連接 score < 100score >= 90 或直接用 90 <= score < 100 ,最後如果輸入的分數不在 0100 的範圍就印出 "That's impossible!!"參考程式碼
9. 承上題,另寫一個程式 exercise0609.py ,改成用 match-case 陳述,注意 case 之後可以改成變數,然後用 if 判斷變數範圍。 參考程式碼
10. 承上題,另寫一個程式 exercise0610.py ,改成直接用數字,注意可以用 連接數字,這是或的意思。 參考程式碼
11. 寫一個程式 exercise0611.py ,先設定序對變數 point 例如 (4, 0) 當座標點,然後利用 match-case 判斷 point 在原點、 X 軸、 Y 軸還是非軸線上。 參考程式碼

上一頁 單元 5 - 運算式與陳述
回 Python 入門指南 5.0 首頁
下一頁 單元 7 - 迴圈
回 Python 教材首頁
回程式語言教材首頁