Python if-elif-else 是控制程式流程最核心的語法,讓程式能依照不同條件執行不同的程式碼區塊。本文完整解析 if、elif、else 的語法結構與縮排規則、多分支條件的設計邏輯、巢狀 if(Nested if)的使用時機,以及三元運算式(Ternary Expression)的簡潔寫法,並附上量化策略信號分級與實戰條件判斷範例。
什麼是 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)
if與else後面必須接冒號:,冒號後的程式碼區塊必須縮排(慣例為 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,可讀性更重要。