Python 數學運算子是所有程式邏輯的起點,從最基本的加減乘除,到取餘數的 %、次方的 **,Python 提供了直覺且強大的算術運算語法。本文完整解析 Python 七大數學運算子的使用方式、PEMDAS 運算優先順序、整除運算子 //,以及複合賦值運算子 +=、-=、*=、/= 的實戰應用,讓你徹底掌握 Python 數值計算的核心技巧。
什麼是數學運算子?
Python 數學運算子(Arithmetic Operators)是用來對數值進行計算的符號,讓 Python 得以作為一台功能強大的計算機。除了日常的加減乘除之外,Python 還內建了取餘數(%)與次方(**)運算子,這使它在科學計算、量化分析等領域特別受到青睞。
可以把數學運算子想像成煉金坊中的各種熔爐工具——每種工具對原料(數值)的處理方式不同,但目的都是將輸入轉化為新的輸出結果。了解每個運算子的特性與優先順序,是寫出正確邏輯程式的必要基礎。
核心語法:七大運算子實戰
# === 基本四則運算 ===
print(10 + 3) # 加法 → 13
print(10 - 3) # 減法 → 7
print(10 * 3) # 乘法 → 30
print(10 / 3) # 除法 → 3.3333...(結果永遠是 float)
# 除法結果一定是浮點數,即使整除也一樣
print(6 / 2) # → 3.0,不是整數 3
Python 的/除法結果永遠回傳 float,即使能整除也是如此。如果你需要整數結果,必須改用//整除運算子。
# === 整除(Floor Division) ===
print(10 // 3) # → 3(商數取整,捨去小數)
print(7 // 2) # → 3(7 ÷ 2 = 3.5,取整為 3)
# 注意:// 是「無條件捨去」,而非四捨五入
print(-7 // 2) # → -4(往更小的整數方向取整)
# === 取餘數(Modulo)% ===
print(10 % 3) # → 1(10 ÷ 3 = 3 餘 1)
print(7 % 2) # → 1(7 ÷ 2 = 3 餘 1)
print(50 % 5) # → 0(整除時餘數為 0)
# 判斷奇偶數(量化策略中常見的邏輯判斷)
number = 42
if number % 2 == 0:
print(f"{number} 是偶數") # 42 是偶數
else:
print(f"{number} 是奇數")
# === 次方(Exponent)** ===
print(2 ** 3) # → 8(2 的 3 次方)
print(2 ** 10) # → 1024
print(9 ** 0.5) # → 3.0(開平方根,即 9 的 0.5 次方)
%取餘數運算子與數學中的 mod 完全相同,最常見的用途是判斷奇偶(n % 2)與循環索引(超出範圍自動歸零),是量化策略、迴圈控制中的核心工具。
規則與注意事項
| 規則 | 正確範例 | 錯誤範例 / 陷阱 |
|---|---|---|
/ 結果永遠是 float |
6 / 2 → 3.0 |
誤以為結果是整數 3 |
// 是無條件捨去(Floor) |
7 // 2 → 3 |
誤以為是四捨五入,-7 // 2 是 -4 非 -3 |
| 運算優先順序遵循 PEMDAS | (2 + 3) * 4 → 20 |
2 + 3 * 4 → 14(乘法先算) |
** 優先級高於負號 |
-(2 ** 3) → -8 |
-2 ** 3 → -8(不是 8,負號後計算) |
% 對負數的行為 |
-7 % 3 → 2(Python 結果符號跟除數相同) |
誤以為結果是 -1(C 語言行為不同) |
常見錯誤與防呆
錯誤一:混淆 / 與 // 的回傳型別
# ❌ 錯誤觀念(以為 / 會回傳整數)
result = 10 / 2
print(type(result)) # ,不是 int!
# ✅ 需要整數結果時,使用 // 或 int()
result_int = 10 // 2
print(result_int, type(result_int)) # 5
錯誤二:忽略 PEMDAS 優先順序
# ❌ 錯誤寫法(誤以為從左到右依序計算)
result = 2 + 3 * 4 # 不是 20,而是 14(乘法先)
print(result) # 14
# ✅ 需要加法先算時,加括號
result = (2 + 3) * 4
print(result) # 20
錯誤三:對負數用 // 整除的預期錯誤
# ❌ 誤以為 -7 // 2 結果是 -3(直覺上的「截斷」)
print(-7 // 2) # 實際輸出:-4(往更小整數方向取整,即 Floor)
# ✅ 若需要截斷行為(Truncate),改用 int()
print(int(-7 / 2)) # → -3(直接去掉小數部分)
進階用法
PEMDAS 運算優先順序
Python 遵循數學的 PEMDAS 規則:括號(Parentheses)→ 指數(Exponents)→ 乘除(Multiplication / Division)→ 加減(Addition / Subtraction),同級運算則由左至右執行。
# 演示 PEMDAS 的實際影響
expr1 = 3 * 3 + 3 / 3 - 3 # 乘除先,再加減
# 步驟:9 + 1.0 - 3 = 7.0
print(expr1) # 7.0
expr2 = 3 * (3 + 3) / 3 - 3 # 括號最優先
# 步驟:3 * 6 / 3 - 3 = 18 / 3 - 3 = 6.0 - 3 = 3.0
print(expr2) # 3.0
# 量化應用:計算持倉報酬率
buy_price = 100
sell_price = 135
shares = 200
profit = (sell_price - buy_price) * shares # 括號確保先算差價
print(f"獲利:{profit}") # 獲利:7000
複合賦值運算子
當需要對同一個變數反覆加減或累算時,Python 提供 +=、-=、*=、/=、%=、**=、//= 等複合賦值運算子,讓程式碼更精簡,也是計分、累積計算的常用模式。
# 複合賦值運算子(與一般賦值等效但更簡潔)
score = 100
score += 10 # 等同 score = score + 10 → 110
score -= 5 # 等同 score = score - 5 → 105
score *= 2 # 等同 score = score * 2 → 210
score //= 3 # 等同 score = score // 3 → 70
score **= 2 # 等同 score = score ** 2 → 4900
score %= 100 # 等同 score = score % 100 → 0
print(score) # 0
# 量化應用:逐筆累計交易損益
pnl = 0
trades = [150, -80, 230, -60, 410] # 正數獲利,負數虧損
for t in trades:
pnl += t # 每筆累加
print(f"總損益:{pnl}") # 總損益:650
% 取餘數的循環應用
% 最強大的場景之一是讓索引在固定範圍內循環,無論值多大都不會超出邊界,常見於週期性資料處理(如星期、K 線週期)或集合索引循環。
# 情境:根據 K 線編號自動對應星期幾(0=週一 ... 4=週五)
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
for bar_index in range(12): # 模擬 12 根 K 線
day = weekdays[bar_index % 5] # 超過 5 自動循環
print(f"K 線 {bar_index:2d} → {day}")
煉金坊小叮嚀
數學運算子看似簡單,但魔鬼藏在細節裡!我在開發量化策略時最常踩的坑,就是除法 / 回傳 float 卻誤當整數用,以及負數整除的行為與直覺不符。建議養成一個習慣:只要涉及除法,就先問自己「我要的是 float 還是 int?」,再決定用 / 還是 //。另外,% 取餘數不只是判斷奇偶,它在做「循環歸位」的應用中非常強大——凱撒密碼、K 線週期對應、環形佇列,都靠它。遇到複雜算式,務必用括號把優先順序寫清楚,讓程式碼對人和電腦都一目了然。