Python 數學運算子:加減乘除、% 取餘數與 ** 次方

Python 數學運算子是所有程式邏輯的起點,從最基本的加減乘除,到取餘數的 %、次方的 **,Python 提供了直覺且強大的算術運算語法。本文完整解析 Python 七大數學運算子的使用方式、PEMDAS 運算優先順序、整除運算子 //,以及複合賦值運算子 +=-=*=/= 的實戰應用,讓你徹底掌握 Python 數值計算的核心技巧。

Cinematic dark alchemy laboratory with glowing mathematical symbols and operator signs floating in amber firelight, mystical arithmetic equations hovering above an ancient stone workbench, deep shadows, dramatic cinematic lighting, 16:9

什麼是數學運算子?

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 / 23.0 誤以為結果是整數 3
// 是無條件捨去(Floor) 7 // 23 誤以為是四捨五入,-7 // 2-4-3
運算優先順序遵循 PEMDAS (2 + 3) * 420 2 + 3 * 414(乘法先算)
** 優先級高於負號 -(2 ** 3)-8 -2 ** 3-8(不是 8,負號後計算)
% 對負數的行為 -7 % 32(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 線週期對應、環形佇列,都靠它。遇到複雜算式,務必用括號把優先順序寫清楚,讓程式碼對人和電腦都一目了然。

張貼留言

較新的 較舊