Python 課程 – 運算子(Operators)
主題:比較運算子(== != > < >= <=)
簡介
在程式語言中,比較運算子是最常用的工具之一,幾乎所有的條件判斷、迴圈控制與資料篩選都離不開它。
Python 以直覺且易讀的語法提供了六種基本的比較運算子:==(等於)、!=(不等於)、>(大於)、<(小於)、>=(大於等於)以及 <=(小於等於)。正確掌握這些運算子的行為,不僅能寫出正確的邏輯,更能避免常見的錯誤與效能問題。
本篇文章針對 初學者到中級開發者,從概念說明、實作範例、常見陷阱到最佳實踐,完整闡述比較運算子的使用方式,並提供實務上常見的應用情境,讓你在寫程式時能更得心應手。
核心概念
1. 基本比較運算子
| 運算子 | 語意 | 範例 | 結果 |
|---|---|---|---|
== |
等於 | 5 == 5 |
True |
!= |
不等於 | 5 != 3 |
True |
> |
大於 | 7 > 4 |
True |
< |
小於 | 2 < 9 |
True |
>= |
大於等於 | 6 >= 6 |
True |
<= |
小於等於 | 3 <= 5 |
True |
注意:比較運算子回傳的永遠是布林值
True或False,而非數字1、0(除非自行轉型)。
2. 物件比較的原則
Python 允許比較不同類型的物件,但 比較的意義必須明確:
- 數值類型(
int,float,bool)可以直接比較。 - 字串 依照 Unicode 編碼逐字比較。
- 容器類型(
list,tuple,dict)比較時會逐元素或鍵值對比。 - 自訂類別 若未實作比較魔法方法(
__eq__、__lt__…),比較會以 物件的身份(id) 為基礎,通常得到False。
3. 鏈式比較
Python 支援 鏈式比較,如 a < b < c,等價於 a < b and b < c,且只會 一次 評估中間變數 b,提升效能且語意更清晰。
age = 25
if 18 <= age <= 30:
print("符合成年且在 18~30 歲之間")
程式碼範例
以下範例皆以 Python 為語言,使用 ```python 標記。
範例 1:基本比較與條件判斷
# 判斷使用者輸入的年齡是否符合投票資格(年滿 18 歲)
age = int(input("請輸入年齡: "))
if age >= 18:
print("你可以投票!")
else:
print("未達投票年齡")
說明:
>=用於比較age是否 大於或等於 18,結果為布林值,直接供if判斷。
範例 2:字串比較與大小寫敏感
password = "OpenAI2025"
# 使用者輸入的密碼
user_input = input("請輸入密碼: ")
# 直接比較(大小寫必須完全相同)
if user_input == password:
print("登入成功")
else:
print("密碼錯誤")
提醒:字串比較是 大小寫敏感 的,若想忽略大小寫,可使用
.lower()或.casefold()。
範例 3:列表(List)元素的比較
# 兩個排序好的列表
list_a = [1, 3, 5, 7]
list_b = [1, 3, 5, 9]
# 直接比較會逐元素比對,若任一位置不同則回傳 False
print(list_a == list_b) # 輸出: False
# 想比較是否為「子集合」可使用 all() 搭配生成式
is_subset = all(item in list_b for item in list_a)
print(is_subset) # 輸出: True
重點:
==針對容器會檢查 長度與順序 是否完全相同。
範例 4:自訂類別的比較
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 定義等於運算子
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
return self.x == other.x and self.y == other.y
p1 = Point(2, 3)
p2 = Point(2, 3)
p3 = Point(5, 1)
print(p1 == p2) # True,因為座標相同
print(p1 == p3) # False
說明:若要讓自訂物件支援
==,必須實作__eq__方法;同理,<、>需要實作__lt__、__gt__等。
範例 5:鏈式比較的實務應用
# 判斷一個數字是否在 0~100 之間(含端點),同時不是 50
num = int(input("請輸入一個整數: "))
if 0 <= num <= 100 and num != 50:
print(f"{num} 符合條件")
else:
print(f"{num} 不符合條件")
技巧:將條件寫成
0 <= num <= 100,比num >= 0 and num <= 100更簡潔且可避免重複計算。
常見陷阱與最佳實踐
| 陷阱 | 描述 | 解決方式 |
|---|---|---|
| 比較不同型別 | 1 == True 會回傳 True(因為 True 轉為 1) |
盡量在比較前顯式轉型或使用 isinstance 檢查型別 |
| 字串大小寫 | "Python" == "python" 為 False |
比較前使用 .lower() 或 .casefold() |
| 浮點數精度 | 0.1 + 0.2 == 0.3 會得到 False |
使用 math.isclose() 或設定容差 |
使用 is vs == |
is 比較物件身份,== 比較值 |
只在需要檢查同一個物件(如 None)時使用 is |
| 鏈式比較中的副作用 | func() < 5 < func2() 會呼叫兩次函式 |
若函式有副作用,請先將結果存變數再比較 |
最佳實踐
- 保持型別一致:在比較前先確保兩側的型別相同,避免隱式轉型帶來的意外。
- 使用
in取代多重or:如x == 1 or x == 2 or x == 3→x in (1, 2, 3)。 - 善用
any()/all():對容器內的多重條件判斷更具可讀性。 - 避免硬編碼:將比較值抽成常數或設定檔,提升維護性。
- 測試邊界值:特別是
>=、<=,務必驗證等於端點的情況。
實際應用場景
- 表單驗證
- 檢查使用者年齡、密碼長度、字元種類是否符合規範。
- 資料篩選
- 在 Pandas、SQLAlchemy 等工具中,使用比較運算子建立過濾條件(如
df[df['score'] >= 80])。
- 在 Pandas、SQLAlchemy 等工具中,使用比較運算子建立過濾條件(如
- 遊戲開發
- 判斷角色屬性是否達到升級門檻、碰撞盒是否相交(座標比較)。
- API 請求參數檢查
- 確認分頁參數
page >= 1、limit <= 100,防止惡意請求。
- 確認分頁參數
- 機器學習前處理
- 把特徵值分箱(binning)時,用
<=、>劃分區間。
- 把特徵值分箱(binning)時,用
總結
比較運算子是 Python 程式設計的基礎且不可或缺 的工具。透過本文,你應已掌握:
- 六大比較運算子的語意與回傳值。
- 物件比較的原則與自訂類別的實作方式。
- 鏈式比較的語法糖與效能優勢。
- 常見的陷阱、最佳實踐以及實務應用情境。
在日常開發中,保持型別一致、善用鏈式比較與容器判斷,不僅能寫出更具可讀性與維護性的程式,也能減少潛在的錯誤。未來無論是寫簡單的條件判斷或是建構複雜的資料篩選邏輯,這些比較運算子都將是你最得力的助手。
祝你在 Python 的學習旅程中,比較順利、邏輯清晰! 🚀