本文 AI 產出,尚未審核

Python – 控制流程(Control Flow)

主題:三元運算式(Ternary Expression)


簡介

在寫程式時,我們常會遇到「依條件決定值」的情境。傳統做法是使用 if … else … 區塊,但在需要簡潔、可讀性高的單行判斷時,三元運算式(又稱條件運算式)是非常實用的工具。

它不僅能讓程式碼更精簡,還能在列表生成式、字典推導式或函式參數傳遞時,減少不必要的換行與縮排,提升程式的流暢度。對於剛入門的學員而言,掌握三元運算式有助於養成「寫得更簡潔、讀得更清楚」的好習慣;對中階開發者來說,更是撰寫高效、易維護程式的利器。


核心概念

1. 基本語法

Python 的三元運算式語法如下:

value_if_true if condition else value_if_false
  • condition:布林表達式,結果為 TrueFalse
  • value_if_true:當條件成立(True)時回傳的值。
  • value_if_false:當條件不成立(False)時回傳的值。

範例

age = 18
status = "成年人" if age >= 18 else "未成年人"
print(status)   # 輸出: 成年人

2. 多層嵌套的寫法

當需要兩個以上的條件分支時,可以將三元運算式疊加,但要注意可讀性:

score = 85
grade = (
    "優秀" if score >= 90 else
    "良好" if score >= 80 else
    "合格" if score >= 60 else
    "不及格"
)
print(grade)   # 輸出: 良好

小技巧:如果分支過多,建議改用 if … elif … else,或使用字典映射,以免程式碼變得難以追蹤。

3. 在列表生成式(list comprehensions)中的應用

三元運算式特別適合與列表生成式結合,快速產生條件過濾的結果:

numbers = [1, 2, 3, 4, 5]
parity = ["偶數" if n % 2 == 0 else "奇數" for n in numbers]
print(parity)   # 輸出: ['奇數', '偶數', '奇數', '偶數', '奇數']

4. 在字典推導式(dict comprehensions)中的應用

同理,字典推導式也能利用三元運算式決定每個鍵的值:

temps_c = {"台北": 28, "高雄": 32, "花蓮": 25}
temps_f = {city: (c * 9/5 + 32) if c > 0 else "測站錯誤"
           for city, c in temps_c.items()}
print(temps_f)
# 輸出: {'台北': 82.4, '高雄': 89.6, '花蓮': 77.0}

5. 作為函式參數的預設值或條件設定

有時候要根據外部參數決定函式內部的行為,三元運算式可以讓呼叫端保持簡潔:

def greet(name: str, formal: bool = False) -> str:
    """根據 formal 參數回傳不同的稱呼方式。"""
    return f"您好,{name}!" if formal else f"嗨,{name}!"

print(greet("小明"))               # 嗨,小明!
print(greet("小明", formal=True)) # 您好,小明!

常見陷阱與最佳實踐

陷阱 說明 建議的解決方式
過度嵌套 三層以上的嵌套會讓程式碼變得難以閱讀。 若條件超過兩層,改用 if … elif … else字典映射
可讀性下降 在長度超過 80 個字元的單行表達式會破壞排版。 使用圓括號分行,或將複雜邏輯抽成小函式。
誤用「賦值」 三元運算式只能回傳值,不能直接執行多個語句。 若需要多行動作,仍應使用傳統 if 區塊。
類型不一致 value_if_truevalue_if_false 必須是同一類型,否則可能導致隱式型別轉換錯誤。 確保兩側回傳相同或兼容的型別,或在必要時顯式轉型。

最佳實踐

  1. 保持單行簡潔:理想的長度在 60–80 個字元之間。
  2. 使用圓括號分段:當條件或回傳值較長時,可用換行加圓括號提升可讀性。
  3. 結合型別註解:在函式回傳值使用三元運算式時,加上型別提示,讓 IDE 更友好。
  4. 避免副作用:三元運算式只應返回值,避免在 value_if_true/false 中執行 I/O 或變數修改。

實際應用場景

  1. 資料清理:將缺失值自動替換為預設值。

    raw_price = None
    price = raw_price if raw_price is not None else 0.0
    
  2. API 回傳結果的快速判斷:根據回傳碼決定訊息。

    status_code = response.status_code
    msg = "成功" if 200 <= status_code < 300 else "失敗"
    
  3. UI 顯示文字:根據使用者角色切換不同的介面文字。

    role = "admin"
    button_label = "管理員面板" if role == "admin" else "使用者首頁"
    
  4. 效能優化:在迭代大量資料時,用三元運算式減少不必要的分支跳躍。

    data = [x if x > 0 else 0 for x in large_dataset]  # 直接把負值轉為 0
    
  5. 測試斷言:在單元測試中快速產生期望值。

    expected = "PASS" if result == target else "FAIL"
    assert expected == "PASS"
    

總結

  • 三元運算式是 Python 中簡潔的條件表達式,語法為 a if cond else b
  • 它適合在單行內完成「條件 → 值」的映射,常與 列表/字典推導式函式參數結合使用。
  • 使用時須注意 可讀性類型一致性 以及 避免副作用;若條件過於複雜,應改用傳統 if … elif … else 或字典映射。
  • 在資料清理、API 回應處理、UI 文字切換等實務情境中,三元運算式能大幅減少程式碼行數,同時保持清晰的邏輯。

掌握好這個小技巧,能讓你的 Python 程式更簡潔易讀,也為日後寫出更具可維護性的程式碼奠定基礎。祝你在 Python 的控制流程中玩得開心,寫出更優雅的程式!