Python if-elif-else:條件判斷與巢狀分支教學

Python if-elif-else 是控制程式流程最核心的語法,讓程式能依照不同條件執行不同的程式碼區塊。本文完整解析 ifelifelse 的語法結構與縮排規則、多分支條件的設計邏輯、巢狀 if(Nested if)的使用時機,以及三元運算式(Ternary Expression)的簡潔寫法,並附上量化策略信號分級與實戰條件判斷範例。

Cinematic dark alchemy forge with a glowing branching path carved in stone floor, three diverging routes lit by amber red and blue magical fire representing if elif else decision branches, deep dramatic shadows, mystical cinematic lighting, 16:9

什麼是 if-elif-else?

if-elif-else 是 Python 的條件分支語法,讓程式根據不同條件走不同的執行路徑。if 是第一個判斷入口;elif(else if 的縮寫)是當前面條件不成立時繼續嘗試的備選條件,可以有多個;else 則是所有條件都不成立時的最終預設路徑,且只能有一個。

可以把 if-elif-else 想像成自動分流的閘道系統:貨物(資料)進來後,依序檢查每道閘門的條件,第一個符合的閘門打開並執行對應處理,其餘閘門全部關閉;若所有閘門都不符合,才走最後的 else 預設通道。

核心語法:條件分支結構

# === 基本 if 語法(只有一個條件)===
temperature = 35

if temperature > 30:
    print("天氣很熱,記得補水")   # 天氣很熱,記得補水

# 條件不成立時什麼都不做,直接跳過

# === if-else(二選一)===
score = 58

if score >= 60:
    print("及格")
else:
    print("不及格")   # 不及格(score = 58,未達 60)
ifelse 後面必須接冒號 :,冒號後的程式碼區塊必須縮排(慣例為 4 個空格)。縮排定義了「屬於這個分支的程式碼範圍」,這是 Python 語法的核心規則。
# === if-elif-else(多條件分支)===
score = 85

if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'       # score = 85,符合這個條件,執行此處
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'F'       # 所有條件都不符合才走這裡

print(f"成績等級:{grade}")   # 成績等級:B

# 重點:條件由上往下依序比對,第一個符合的就執行,其餘跳過
# score = 85 符合 >= 80,所以 B,不會再繼續判斷 >= 70
elif 的數量沒有上限,但要注意條件的排列順序非常重要——必須從最嚴格(範圍最小)的條件寫到最寬鬆,否則寬鬆條件會提前攔截所有情況,導致後面的分支永遠不會執行。

規則與注意事項

規則 正確範例 錯誤範例 / 陷阱
條件句後面必須有冒號 : if x > 0: if x > 0 → SyntaxError
程式碼區塊必須縮排(4 空格) 縮排對齊的程式碼屬於同一區塊 無縮排 → IndentationError
elif / else 不能獨立存在 必須有前置 if 才能接 elif / else 單獨寫 elif: → SyntaxError
條件由上往下,第一個符合即停止 嚴格條件寫前面,寬鬆條件寫後面 寬鬆條件(如 >= 60)寫前面,後面的分支永遠不觸發
else 不加條件,是最終預設 else:(無條件) else x > 0: → SyntaxError

常見錯誤與防呆

錯誤一:elif 條件順序錯誤,導致分支永遠不觸發

# ❌ 錯誤寫法(寬鬆條件寫最前面,score >= 60 會攔截所有及格分數)
score = 95
if score >= 60:
    grade = 'D'    # score = 95 也會被這裡攔截!永遠拿到 D
elif score >= 80:
    grade = 'B'    # 永遠不會執行到這裡
elif score >= 90:
    grade = 'A'    # 永遠不會執行到這裡

# ✅ 正確寫法:嚴格條件(範圍小)寫前面
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 60:
    grade = 'D'
print(grade)   # A

錯誤二:縮排不一致導致 IndentationError

# ❌ 錯誤寫法(混用 Tab 與空格,或縮排不對齊)
x = 10
if x > 5:
    print("大於 5")   # 4 個空格
      print("確定")   # 6 個空格 → IndentationError

# ✅ 正確寫法:同一區塊統一用 4 個空格
if x > 5:
    print("大於 5")
    print("確定")

錯誤三:忘記冒號導致 SyntaxError

# ❌ 錯誤寫法(if / elif / else 後面漏掉冒號)
if x > 5    # SyntaxError: expected ':'
    print("大於 5")

# ✅ 正確寫法
if x > 5:
    print("大於 5")

進階用法

巢狀 if(Nested if)

if 內部可以再包含另一個 if,形成巢狀條件判斷,適合需要「先通過外層篩選,再做細部判斷」的場景。但巢狀層數建議不超過 3 層,否則可讀性會急速下降。

# 情境:ATM 提款邏輯
balance = 5000
withdraw = 3000
pin_correct = True

if pin_correct:                          # 外層:密碼是否正確
    if withdraw <= balance:              # 內層:餘額是否足夠
        balance -= withdraw
        print(f"提款成功,餘額:{balance}")   # 提款成功,餘額:2000
    else:
        print("餘額不足,提款失敗")
else:
    print("密碼錯誤,請重新輸入")

三元運算式(Ternary Expression)

if-else 只是用來在兩個值中選一個時,可以改用三元運算式(條件表達式)把整個判斷壓縮成一行,語法為 值A if 條件 else 值B

# 一般 if-else 寫法(4 行)
score = 75
if score >= 60:
    result = "及格"
else:
    result = "不及格"

# 三元運算式(1 行,語意完全相同)
result = "及格" if score >= 60 else "不及格"
print(result)   # 及格

# 量化應用:判斷多空方向
rsi = 72
direction = "多頭過熱" if rsi > 70 else "正常區間"
print(direction)   # 多頭過熱

# 也可以用在 f-string 中直接嵌入
pnl = -350
print(f"本次交易{'獲利' if pnl > 0 else '虧損'}:{abs(pnl)} 元")
# 本次交易虧損:350 元

量化實戰:K 線信號分級系統

多層 if-elif-else 非常適合根據指標數值將信號分級,讓策略對不同強度的市場狀況做出差異化回應。

# 情境:RSI 五級強弱分類
rsi = 22.5

if rsi <= 20:
    signal = "極度超賣,強力買入"
    strength = 5
elif rsi <= 30:
    signal = "超賣區,考慮買入"     # rsi = 22.5 符合此條件
    strength = 4
elif rsi <= 45:
    signal = "弱勢偏空,觀望"
    strength = 3
elif rsi <= 55:
    signal = "中性震盪,無信號"
    strength = 2
elif rsi <= 70:
    signal = "偏強,持有觀察"
    strength = 1
else:
    signal = "超買區,考慮賣出"
    strength = 0

print(f"RSI {rsi}:{signal}(強度:{strength})")
# RSI 22.5:超賣區,考慮買入(強度:4)

煉金坊小叮嚀

if-elif-else 是 Python 中使用頻率最高的語法之一,掌握它就掌握了程式邏輯的基本骨架。我在開發量化策略時,最常犯的錯是 elif 條件順序寫反——把寬鬆條件放前面,導致嚴格條件永遠觸發不到,而且這種 bug 不會報錯,只會讓策略默默跑錯。口訣記住:條件從嚴到寬,由上往下排;嚴格的(範圍小的)永遠寫前面。另外,巢狀 if 超過兩層就要考慮重構,可以改用 and 把條件合併,或是把內層邏輯抽成獨立函數。三元運算式很優雅,但只適合「二選一」的簡單情況,複雜邏輯還是老老實實用多行 if-elif-else,可讀性更重要。

張貼留言

較新的 較舊