本文 AI 產出,尚未審核

Python 控制流程 — 巢狀條件判斷

簡介

在程式設計中,條件判斷是讓程式根據不同情況執行不同路徑的核心機制。當單一條件已不足以描述需求時,我們常會使用 巢狀(nested)條件判斷,即在 ifelifelse 區塊裡再放入另一層 if 判斷。

巢狙條件不只讓邏輯更完整,也能避免大量的重複程式碼,提高可讀性與維護性。對於初學者而言,掌握巢狀條件的寫法與常見陷阱,是邁向中級 Python 開發者的重要一步。


核心概念

1. 基本語法

Python 的條件判斷使用 ifelifelse,巢狀寫法只需要把另一個 if 放在原本區塊的內縮區域:

if 條件A:
    # 條件A 為 True 時執行
    if 條件B:
        # 同時滿足 A 與 B 時執行
        ...
    else:
        # 只滿足 A、但不滿足 B 時執行
        ...
else:
    # 條件A 為 False 時執行
    ...

提示:Python 依靠 縮排(通常 4 個空格)來界定程式區塊,務必保持一致的縮排風格。


2. 多層巢狀的實務寫法

範例 1:判斷使用者等級與權限

def check_permission(user):
    if user.is_active:                     # 第一層:使用者是否啟用
        if user.role == "admin":           # 第二層:是否為管理員
            return "完全存取"
        elif user.role == "editor":        # 第二層的另一條件
            return "編輯權限"
        else:
            return "一般使用者"
    else:
        return "帳號未啟用"

說明:先檢查帳號是否啟用,再根據不同角色回傳對應權限,層層篩選避免不必要的權限檢查。


範例 2:分段計算稅率(累進稅)

def calculate_tax(income):
    if income <= 0:
        return 0
    if income <= 30000:
        tax = income * 0.05
    else:
        # 超過 30,000 的部分使用更高稅率
        if income <= 70000:
            tax = 30000 * 0.05 + (income - 30000) * 0.10
        else:
            tax = (30000 * 0.05 +
                   40000 * 0.10 +          # 30,001 ~ 70,000 的稅金
                   (income - 70000) * 0.20)  # 超過 70,000 的稅金
    return tax

說明:外層先排除非正收入,第二層判斷收入區間,內層再細分更高區段,清楚呈現 累進稅制 的計算邏輯。


範例 3:驗證密碼強度

import re

def password_strength(pwd):
    if len(pwd) < 8:
        return "太短"
    else:
        # 檢查是否同時包含大小寫、數字與特殊字元
        if (re.search(r"[A-Z]", pwd) and
            re.search(r"[a-z]", pwd) and
            re.search(r"\d", pwd) and
            re.search(r"[!@#$%^&*]", pwd)):
            return "強"
        elif (re.search(r"[A-Z]", pwd) or re.search(r"[a-z]", pwd)) and re.search(r"\d", pwd):
            return "中"
        else:
            return "弱"

說明:外層先過長度檢查,內層根據正規表達式逐層判斷字元組合,讓密碼強度評估既精確易讀


範例 4:簡易購物車折扣

def cart_discount(total, is_member):
    if total >= 1000:
        if is_member:
            return total * 0.85   # 會員滿千打 85 折
        else:
            return total * 0.90   # 非會員滿千打 9 折
    else:
        if is_member:
            return total * 0.95   # 會員未滿千打 95 折
        else:
            return total          # 無折扣

說明:兩個判斷條件(購物金額、會員身分)交叉組合,使用巢狀 if 能避免寫出 8 條獨立的 if-elif,程式更簡潔。


範例 5:天氣與穿著建議(實務情境)

def outfit_advice(temp, weather):
    if temp < 10:                     # 冷天
        if weather == "rain":
            return "穿防水外套、保暖內衣"
        else:
            return "穿厚外套、圍巾"
    elif temp < 25:                  # 溫暖
        if weather == "rain":
            return "帶雨具,穿薄外套"
        else:
            return "穿長袖或薄外套"
    else:                             # 炎熱
        if weather == "rain":
            return "帶雨具,穿短袖"
        else:
            return "穿短袖、短褲"

說明:根據 溫度天氣狀況 兩個維度給出穿著建議,典型的「多條件 + 多結果」情境。


3. 何時使用巢狀條件?

情境 建議寫法
條件間有明顯層級關係(如先篩選大類再細分) 巢狀 if
條件相互獨立,且每個條件都可能觸發結果 if‑elif‑else字典映射
條件組合過多,導致多層巢狀 考慮 函式拆分策略模式match/case(Python 3.10+)

常見陷阱與最佳實踐

1. 縮排錯誤

Python 完全依賴縮排,少一個或多一個空格都會改變程式的執行邏輯,甚至拋出 IndentationError建議在編輯器中設定 Tab → 4 spaces,並啟用 顯示不可見字元

2. 過度巢狀

當巢狀層數超過 3 層 時,程式的可讀性會急速下降。此時可:

  • 把內層條件抽成 子函式
  • 使用 早期返回(early return) 讓程式提前結束
  • 改寫成 dictmatch/case 結構
def is_eligible(user):
    if not user.is_active:
        return False
    if user.age < 18:
        return False
    if user.role not in ("admin", "editor"):
        return False
    return True          # 直接返回結果,避免深層巢狀

3. 條件重複檢查

在巢狀裡常會看到同一條件被檢查兩次,例如:

if a > 0:
    if a > 10:    # 重複檢查 a > 0
        ...

最佳實踐:把條件合併或使用 andor

if a > 10:
    ...

4. 使用過長的單行判斷

過長的條件式會讓程式碼難以閱讀。可利用 換行括號 使之更清晰:

if (user.is_active and
    user.role == "admin" and
    user.last_login > datetime.now() - timedelta(days=30)):
    ...

5. 忽略 elif 的優先順序

elif 只會在前面的條件皆為 False 時才會被評估。若條件有重疊,需要先把 更嚴格 的條件寫在上面。

# 錯誤範例:兩個條件皆可成立,第二個永遠不會觸發
if x > 0:
    ...
elif x > 10:   # 永遠不會執行
    ...

正確寫法:

if x > 10:
    ...
elif x > 0:
    ...

實際應用場景

  1. 使用者驗證與授權:先檢查帳號是否有效,再根據角色、權限層級決定存取資源。
  2. 金融計算:累進稅率、分段利率、保險費率等,都需要根據金額區間層層遞進。
  3. 遊戲 AI:根據玩家距離、血量、環境狀態決定 AI 行為,往往是多層條件的典型。
  4. 資料清理:先篩選資料來源,再根據欄位型別或缺失值進行不同的清理策略。
  5. IoT 裝置控制:根據感測器的溫度、濕度、時間等多重條件,決定開關設備或發送警報。

總結

  • 巢狀條件 是在條件間具有層級關係時的自然寫法,能讓程式邏輯更貼近真實需求。
  • 縮排層數控制避免重複檢查 是避免常見錯誤的關鍵。
  • 當巢狀層數過深時,考慮 函式抽離早期返回match/case 以提升可讀性。
  • 在實務開發中,從使用者授權、財務計算到 IoT 控制,巢狀條件都是不可或缺的工具。

掌握了上述概念與最佳實踐,你就能在 Python 專案中寫出 結構清晰、易於維護 的條件判斷程式,為日後的功能擴充與除錯奠定堅實基礎。祝你 coding 順利!