運算符號與Promotion
運算符號與型別提升(Promotion)
學習目標
- 認識 Python 中主要的運算符號類型:算術、比較、邏輯、指派。
- 理解「型別提升」在混合型別運算中的自動轉換機制。
- 學會區分浮點數除法
/與整數除法//的不同。 - 掌握如何使用比較與邏輯運算符號來建立條件判斷。
- 了解複合指派運算符號如何讓程式碼更簡潔。
第 1 章:算術運算符號 (Arithmetic Operators)
算術運算符號用於執行基本的數學計算,是你學習程式設計最先接觸到的運算符號。
| 運算符號 | 名稱 | 範例 | 結果 | 說明 |
|---|---|---|---|---|
+ |
加 | 10 + 5 |
15 |
|
- |
減 | 10 - 5 |
5 |
|
* |
乘 | 10 * 5 |
50 |
|
/ |
除 (浮點數) | 10 / 5 |
2.0 |
浮點數的商 |
// |
整數除法 | 10 // 3 |
3 |
整數的商 |
% |
模除(Modulo) | 10 % 3 |
1 |
餘數 |
** |
乘方 | 2 ** 3 |
8 |
2 的 3 次方 |
第 2 章:型別提升 (Type Promotion)
當你對兩種不同數字型別的資料進行運算時,會發生什麼事?例如,一個整數 (int) 和一個浮點數 (float) 相加?
為了避免遺失精度 (例如小數點後的數字),Python 會自動將「整數」的型別提升為「浮點數」的型別,這個過程稱為型別提升 (Type Promotion)。
運算流程解析:5 + 2.5
- Python 偵測到兩個運算元:
5(型別為int) 和2.5(型別為float)。 - Python 決定將結果提升為
float。 - 它在內部呼叫 float(
5),建立值為5.0的 float物件。(不是轉換,5 仍然存在) - 最後,執行
5.0 + 2.5的浮點數運算。 - 得到最終結果
7.5,其型別為float。
result = 5 + 2.5
print(result)
print(type(result))
輸出結果:
7.5<class 'float'>
第 3 章:比較運算符號 (Comparison Operators)
比較運算符號用於比較兩個值的大小或是否相等。它們的運算結果永遠是布林值 (bool),也就是 True 或 False。
| 運算符號 | 名稱 | 範例 | 結果 |
|---|---|---|---|
== |
等於 | 5 == 5 |
True |
!= |
不等於 | 5 != 6 |
True |
> |
大於 | 10 > 5 |
True |
< |
小於 | 10 < 5 |
False |
>= |
大於等於 | 5 >= 5 |
True |
<= |
小於等於 | 5 <= 4 |
False |
注意: '='是「指派」,用來把值指派給變數;'=='才是「比較」,用來判斷兩邊是否相等。這是初學者最常犯的錯誤之一!
第 4 章:邏輯運算符號(Logical Operators)
邏輯運算符號的左值與右值都是布林值,一般用於結合多個布林運算式,常見於 if 判斷式中。
and: 左右兩邊的條件都必須為True,結果才是True。or: 左右兩邊的條件只要有一個為True,結果就是True。not: 將布林值反轉 (not True變成False)。
age = 25
has_ticket = True
# 範例 1: and
# 檢查年齡是否介於 18 到 65 之間
is_adult = age >= 18 and age < 65
print("是成年人嗎?", is_adult)
# 範例 2: or
# 只要是 VIP 或持有學生證其一,即可享有折扣
is_vip = False
is_student = True
has_discount = is_vip or is_student
print("有折扣嗎?", has_discount)
# 範例 3: not
can_enter = not age < 18 # 等同於 age >= 18
print("可以入場嗎?", can_enter)
第 5 章:指派運算符號 (Assignment Operators)
指派運算符號用於將值賦予變數。除了最基本的 =,還有一系列的「複合指派運算符號」,它們是將算術運算與指派合併的語法糖,能讓程式碼更精簡。
| 運算符號 | 等價於 | 範例 |
|---|---|---|
x += 5 |
x = x + 5 |
將 x 的值加 5 |
x -= 5 |
x = x - 5 |
將 x 的值減 5 |
x *= 5 |
x = x * 5 |
將 x 的值乘以 5 |
x /= 5 |
x = x / 5 |
將 x 的值除以 5 |
score = 100
print("原始分數:", score)
# 加上獎勵分數 10 分
score += 10 # 等同於 score = score + 10
print("加分後:", score)
# 因為犯規,分數扣半
score /= 2 # 等同於 score = score / 2
print("扣半後:", score)
第六章:位元運算符號
電腦中的所有運算最終都是由一連串的 0 和 1 組成的。這些0 和 1 就是**位元 (Bit)**。
位元運算就是直接操作這些 0 和 1 的運算。
10 進位 VS 2 進位
在 Python 中,使用 bin() 函數可以查看一個數字的二進位形式 (0b 開頭代表二進位):
| 十進位 | 二進位 (電腦的 0/1) |
|---|---|
| 5 | 0b101 |
| 3 | 0b11 |
十進位轉二進位 (Decimal to Binary)
方法:連續除以 2 (Repeated Division by 2)
步驟:
- 用十進位數除以 2。
- 記錄下**餘數** (Remainder),只會是 0 或 1。
- 將得到的**商數** (Quotient) 作為下一次除法的被除數。
- 重複以上步驟,直到商數變成 0 為止。
- 將所有餘數**由下往上**(從最後一個到第一個)排列起來,即為二進位結果。
範例:將十進位 25 轉換為二進位
| 運算 | 商數 (Quotient) | 餘數 (Remainder) |
|---|---|---|
| 25 \ 2 | 12 | 1 (最低位) |
| 12 \ 2 | 6 | 0 |
| 6 \ 2 | 3 | 0 |
| 3 \ 2 | 1 | 1 |
| 1 \ 2 | 0 | 1 (最高位) |
依序由下往上排列餘數:**11001**
結果:25_{10} = 11001_2
二進位轉十進位 (Binary to Decimal)
方法:位值加權求和法 (Weighted Sum)
步驟:
- 確認二進位數每個位元對應的 2 的冪次(權重):最右邊是 2^0,往左依序是 2^1, 2^2.....。
- 將每個位元 (0 或 1) 乘以其對應的權重。
- 將所有的乘積相加,即得到十進位結果。
範例:將二進位 11001 轉換為十進位
| 二進位位元 (Bit) | 權重 (Power of 2) | 乘積 (Bit \times Weight) |
|---|---|---|
| 1 | 2^4 = 16 | 1 * 16 = 16 |
| 1 | 2^3 = 8 | 1 * 8 = 8 |
| 0 | 2^2 = 4 | 0 * 4 = 0 |
| 0 | 2^1 = 2 | 0 * 2 = 0 |
| 1 | 2^0 = 1 | 1 * 1 = 1 |
將乘積加總:16 + 8 + 0 + 0 + 1 = 25
結果:11001_2 = 25_{10}
運算符號
| 符號 | 中文名稱 | 英文名稱 | 運算 |
|---|---|---|---|
& | 位元且 | AND | 只有兩個都是 1 才等於 1 |
| | 位元或 | OR | 只要有一個是 1 就等於 1 |
^ | 位元互斥或 | XOR | 兩個不一樣才等於 1 |
~ | 位元反轉 | NOT | 把 1 變 0,0 變 1 |
<< | 左移 | Left Shift | 向左移,右側補 0 |
>> | 右移 | Right Shift | 向右移,左側補 0或1 |
範例 (A=5, B=3)
範例數字: A=5 (0101) 和 B=3 (0011)
1. 位元 and (&):
對應的兩個位元都是 1,結果的位元才是 1。
A = 5 # 0101
B = 3 # 0011
result = A & B
# 0101
# & 0011
# ------
# 0001 <-- 結果是 1
print(result) # 輸出: 1
2. 位元 or (|):
對應的兩個位元中至少有一個是 1,結果的位元就是 1。
A = 5 # 0101
B = 3 # 0011
result = A | B
# 0101
# | 0011
# ------
# 0111 <-- 結果是 7
print(result) # 輸出: 7
3. 位元互斥 (^):
對應的兩個位元不相同(一個 0 一個 1),結果的位元才是 1。
A = 5 # 0101
B = 3 # 0011
result = A ^ B
# 0101
# ^ 0011
# ------
# 0110 <-- 結果是 6
print(result) # 輸出: 6
4. 位元反轉 (~):
將數字的每個位元反轉。在 Python 中,快速計算的公式是:X = -(X + 1)。
A = 5
result = ~A
# ~5 等於 -(5 + 1)
print(result) # 輸出: -6
5. 左移 (<<):
向左推動 n 位,右邊補 0。
A = 5 # 0101
result = A << 2 # 左移 2 位
# 0101 << 2 變成 010100
# 010100 <-- 結果是 20
print(result) # 輸出: 20
6. 右移 (>>):
向右推動 n 位,右邊的位元被丟棄。
A = 20 # 010100
result = A >> 2 # 右移 2 位 (整數除以 2^2=4)
# 010100 >> 2 變成 0101
# 0101 <-- 結果是 5
print(result) # 輸出: 5

留言
張貼留言