Python 邏輯運算子:and、or、not 條件組合

Python 邏輯運算子 andornot 用來將多個比較條件組合成更複雜的判斷邏輯,結果同樣回傳布林值 TrueFalse。本文完整解析三大邏輯運算子的語意與真值表、短路求值(Short-circuit Evaluation)機制、優先順序規則,以及 Truthy / Falsy 值的概念,並附上量化策略多條件篩選與防呆判斷的實戰範例。

Cinematic dark alchemy laboratory with three glowing arcane gate symbols labeled AND OR NOT carved in ancient stone, mystical amber and blue firelight casting deep dramatic shadows, logic flow visualized as branching rivers of light, 16:9

什麼是邏輯運算子?

邏輯運算子(Logical Operators)是用來連接多個條件並產生單一布林結果的關鍵字。Python 使用英文單字 andornot 作為邏輯運算子,比其他語言的 &&||! 更接近自然語言,閱讀時幾乎如同英文句子。

可以把三個邏輯運算子想像成三種不同嚴格程度的門衛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

量化實戰:多條件進場邏輯

邏輯運算子是量化策略中組合多個技術條件的核心工具,合理搭配 andornot 能讓策略邏輯清晰且易於維護。

# 情境:多因子買進條件篩選
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,才能讓程式健壯不崩潰。

張貼留言

較新的 較舊