Python 邏輯運算子 and、or、not 用來將多個比較條件組合成更複雜的判斷邏輯,結果同樣回傳布林值 True 或 False。本文完整解析三大邏輯運算子的語意與真值表、短路求值(Short-circuit Evaluation)機制、優先順序規則,以及 Truthy / Falsy 值的概念,並附上量化策略多條件篩選與防呆判斷的實戰範例。
什麼是邏輯運算子?
邏輯運算子(Logical Operators)是用來連接多個條件並產生單一布林結果的關鍵字。Python 使用英文單字 and、or、not 作為邏輯運算子,比其他語言的 &&、||、! 更接近自然語言,閱讀時幾乎如同英文句子。
可以把三個邏輯運算子想像成三種不同嚴格程度的門衛:and 是嚴格門衛——兩個條件都必須符合才放行;or 是寬鬆門衛——只要有一個條件符合就放行;not 則是反向門衛——把原本的結論直接翻轉。
核心語法:and、or、not 實戰
# === and:兩個條件都必須為 True,結果才是 True ===
print(True and True) # True
print(True and False) # False
print(False and True) # False
print(False and False) # False
# 實際範例
age = 25
has_license = True
if age >= 18 and has_license:
print("可以開車") # 可以開車
# 若任一條件不符,就不放行
age = 16
if age >= 18 and has_license:
print("可以開車")
else:
print("不符合條件") # 不符合條件(age 未達 18)
and的口訣:一假即假,全真才真。只要左右任一條件為False,整個and運算式就回傳False。
# === or:只要有一個條件為 True,結果就是 True ===
print(True or True) # True
print(True or False) # True
print(False or True) # True
print(False or False) # False(兩個都 False 才是 False)
# 實際範例:會員或 VIP 都能進入
is_member = False
is_vip = True
if is_member or is_vip:
print("歡迎入場") # 歡迎入場(VIP 條件成立)
# === not:將布林值反轉 ===
print(not True) # False
print(not False) # True
logged_in = False
if not logged_in:
print("請先登入") # 請先登入
# not 也可以搭配比較運算式
x = 10
print(not (x > 5)) # False(x > 5 是 True,not 反轉為 False)
or的口訣:一真即真,全假才假。not的口訣:真變假、假變真,用於讓條件語意更自然易讀,例如if not is_empty:比if is_empty == False:更 Pythonic。
規則與注意事項
| 規則 | 正確範例 | 錯誤範例 / 陷阱 |
|---|---|---|
| 優先順序:not > and > or | not a and b or c 先算 not,再 and,再 or |
不加括號時誤判運算順序 |
| not 後面不需要括號(但加上更清晰) | not x == 5 等同 not (x == 5) |
誤寫成 (not x) == 5(語意不同) |
| 0、""、[]、None 視為 Falsy | if my_list:(非空才執行) |
誤用 if my_list != []:(可直接用 Truthy 判斷) |
| and / or 回傳的是運算元本身,不一定是布林值 | x = None or 'default' → 'default' |
誤以為一定回傳 True / False |
| 短路求值:and 遇 False 停止;or 遇 True 停止 | x != 0 and 10 / x > 1(防止除以零) |
不依賴短路時可能造成 ZeroDivisionError |
常見錯誤與防呆
錯誤一:忘記每個條件都要完整寫出來
# ❌ 錯誤寫法(語法上合法,但語意錯誤!)
x = 5
if x == 3 or 5: # 這裡的 5 永遠是 Truthy,整個條件永遠 True
print("符合條件") # 不管 x 是什麼都會印出!
# ✅ 正確寫法:每個比較條件都要完整
if x == 3 or x == 5:
print("符合條件") # 符合條件(x 確實等於 5)
錯誤二:not 優先級比 and / or 高,忘記加括號
# ❌ 容易誤解的寫法
a = True
b = False
print(not a and b) # False(先算 not a = False,再 False and False)
# 若想表達「not (a and b)」,必須明確加括號
print(not (a and b)) # True(a and b = True,not True = False → 不對)
# 實際:not (True and False) = not False = True ✅
錯誤三:對 None 或空值做邏輯運算前未先確認型別
# ❌ 可能觸發 AttributeError 或 TypeError
data = None
if data and data['price'] > 100: # data 為 None 時短路,不會進入右側
print("價格超過 100")
# ✅ 短路求值保護(and 左側為 Falsy 時,右側不執行)
# 這個寫法其實是安全的!None 是 Falsy,and 會短路停止
# 更明確的防呆寫法:
if data is not None and data['price'] > 100:
print("價格超過 100")
進階用法
短路求值(Short-circuit Evaluation)
Python 邏輯運算子採用短路求值策略:and 在左側為 False 時直接停止(不計算右側);or 在左側為 True 時直接停止。這個特性可以用來防止潛在的執行期錯誤。
# 短路保護:防止除以零
divisor = 0
if divisor != 0 and (100 / divisor > 10):
print("商大於 10")
else:
print("除數為零,跳過計算") # 除數為零,跳過計算
# divisor != 0 為 False,and 直接短路,右側不執行
# 短路賦值:or 的預設值模式
name = ""
display_name = name or "匿名使用者" # name 是 Falsy,or 繼續求值右側
print(display_name) # 匿名使用者
config = None
timeout = config or 30 # config 為 None(Falsy),使用預設值 30
print(timeout) # 30
Truthy 與 Falsy 值
Python 中幾乎所有物件都可以放入邏輯運算,不需要明確轉成 True / False。以下值在布林上下文中被視為 Falsy(假值),其餘皆為 Truthy(真值)。
# Falsy 值列表(在 if / and / or 中視為 False)
falsy_values = [0, 0.0, '', [], {}, set(), None, False]
for val in falsy_values:
if not val:
print(f"{repr(val):10} → Falsy")
# 實際應用:判斷串列是否有資料
signals = [] # 空串列是 Falsy
if signals:
print("有信號,執行策略")
else:
print("無信號,等待下一根 K 線") # 無信號,等待下一根 K 線
signals = ['BUY']
if signals:
print(f"執行信號:{signals[0]}") # 執行信號:BUY
量化實戰:多條件進場邏輯
邏輯運算子是量化策略中組合多個技術條件的核心工具,合理搭配 and、or、not 能讓策略邏輯清晰且易於維護。
# 情境:多因子買進條件篩選
rsi = 27.5 # RSI 指標
macd_cross = True # MACD 金叉
volume_ok = True # 成交量放大
in_position = False # 目前未持倉
# 進場條件:RSI 超賣 AND MACD 金叉 AND 成交量放大 AND 未持倉
long_signal = (rsi < 30) and macd_cross and volume_ok and (not in_position)
print(f"買進信號:{long_signal}") # 買進信號:True
# 出場條件:RSI 超買 OR MACD 死叉(任一成立就出場)
rsi_ob = 72.0
macd_death = False
exit_signal = (rsi_ob > 70) or macd_death
print(f"出場信號:{exit_signal}") # 出場信號:True
煉金坊小叮嚀
邏輯運算子是策略開發與日常程式設計中使用頻率最高的語法之一。特別提醒兩個實戰中最常犯的錯:第一,if x == 3 or 5: 這種寫法語法合法卻語意完全錯誤,右側的 5 永遠是 Truthy,條件永遠成立——這種 bug 不會報錯,只會讓你的邏輯悄悄失效。每個比較條件都必須完整寫出,例如 if x == 3 or x == 5:。第二,短路求值不只是效能優化,更是防止執行期錯誤的重要工具。養成「先判斷安全條件,再做運算」的寫法習慣,例如先確認除數不為零、先確認物件不是 None,才能讓程式健壯不崩潰。