Python 控制流程 — 巢狀條件判斷
簡介
在程式設計中,條件判斷是讓程式根據不同情況執行不同路徑的核心機制。當單一條件已不足以描述需求時,我們常會使用 巢狀(nested)條件判斷,即在 if、elif、else 區塊裡再放入另一層 if 判斷。
巢狙條件不只讓邏輯更完整,也能避免大量的重複程式碼,提高可讀性與維護性。對於初學者而言,掌握巢狀條件的寫法與常見陷阱,是邁向中級 Python 開發者的重要一步。
核心概念
1. 基本語法
Python 的條件判斷使用 if、elif、else,巢狀寫法只需要把另一個 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) 讓程式提前結束
- 改寫成 dict 或 match/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
...
最佳實踐:把條件合併或使用 and、or:
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:
...
實際應用場景
- 使用者驗證與授權:先檢查帳號是否有效,再根據角色、權限層級決定存取資源。
- 金融計算:累進稅率、分段利率、保險費率等,都需要根據金額區間層層遞進。
- 遊戲 AI:根據玩家距離、血量、環境狀態決定 AI 行為,往往是多層條件的典型。
- 資料清理:先篩選資料來源,再根據欄位型別或缺失值進行不同的清理策略。
- IoT 裝置控制:根據感測器的溫度、濕度、時間等多重條件,決定開關設備或發送警報。
總結
- 巢狀條件 是在條件間具有層級關係時的自然寫法,能讓程式邏輯更貼近真實需求。
- 縮排、層數控制、避免重複檢查 是避免常見錯誤的關鍵。
- 當巢狀層數過深時,考慮 函式抽離、早期返回 或 match/case 以提升可讀性。
- 在實務開發中,從使用者授權、財務計算到 IoT 控制,巢狀條件都是不可或缺的工具。
掌握了上述概念與最佳實踐,你就能在 Python 專案中寫出 結構清晰、易於維護 的條件判斷程式,為日後的功能擴充與除錯奠定堅實基礎。祝你 coding 順利!