運算子
運算式是由運算元與運算子所組成的計算式。運算子是指對運算元做特定運算的符號,例如: +、-、*、/...等。而運算元是運算的對象,運算元可以為變數、常值或是運算式,是由運算元與運算子所組成的計算式。

若按照運算所需要的運算元數目來分類,可分成:
- 一元運算子: -(負),如: -5。
- 二元運算子: +、-、*、/、+=…等,如: x + y、x / y。
Python語言所提供的常用運算子,有指定、算術、複合指定、關係、邏輯、位元、移位、成員、身分運算子。
1. 指定運算子
宣告變數指定初值,或是要改變數值時,可以使用指定運算子「=」。指定時可以將一個常值、變數或運算式的結果,語法為:
變數名稱 = 常值 | 變數 | 運算式在Python語言中,int、float、string…等資料型別是屬於不可變物件,變數值是不會改變。如果變數值改變時,會先將變數複製到新記憶體位址才改變變數值。
在其他程式語言中要交換兩個變數值時,程式寫法為 temp =x; x = y; y = temp(使用 「;」號可以將敘述合併成一行),但是在Python中要交換兩個變數值時,只要寫 x, y = y, x 就可以達成,因為是直接將兩變數的記憶體位址交換,所以程式語法可以很精簡。
[例] 下列為指定變數值的範例: (檔名:assignment.py)
x=5 # 指定x變數值為常值5
y=x # 指定y變數值為變數x的值
print(id(x),id(y)) # 顯示變數x,y的記憶體位置
x=3+y # 指定x變數值為運算式3+y的結果
print(id(x),id(y))
a,b=2,3
print(id(a),id(b))
a,b=b,a #a,b變數值交換
print(id(a),id(b))說明
- 第3行:使用 id() 函式,可以取得物件使用的記憶體位址。執行時會發現 x 和 y 變數會使用同一個記憶體位置,因為在第 2 行指定 y=x,此時會將 x 變數的記憶體位址傳給y變數,x和y變數的記憶體位址相同所以變數值會相同。
- 第 4 行:在第 4 行改變 x 變數的值,此時就會使用新的記憶體位址來存放 x 變數,而 y 變數的記憶體位址維持不變。
- 第 8 行:將 a 和 b 兩變數的變數值相互交換。
- 第 9 行:顯示 a 和 b 兩變數的記憶體位址時,會發現 a 和 b 兩變數的記憶體位址會交換,就能達到變數數值交換的效果。
2. 算術運算子
算術運算子可以用來執行數學運算,包括加法、減法、乘法、除法、取餘數…等。下表為Python語言常用的算術運算子:
| 運算子 | 功能說明 | 範例 | 結果(假設 y = 5) |
|---|---|---|---|
+ | 加法 | x = y + 2 | x 變數值為 7 |
- | 減法 | x = y - 2 | x 變數值為 3 |
* | 乘法 | x = y * 2 | x 變數值為 10 |
/ | 浮點數除法 | x = y / 2 | x 變數值為 2.5 |
// | 整數除法 | x = y // 2 | x 變數值為 2 |
% | 取除法的餘數 | x = y % 2 | x 變數值為 1 |
** | 次方(指數) | x = y ** 2 | x 變數值為 25() |
範例 (檔名:arithmetic.py)
已知圓的半徑為 6.4,請算出圓的面積、圓周長和圓球的面積。
結果
圓的半徑: 6.4
圓面積: 128.67952640000001
圓周長: 40.212352
球的體積: 1098.0652919466668程式碼
r=6.4
PI=3.14159
print("圓的半徑:",r)
print("圓面積:",PI*r**2) #公式:PIx半徑x半徑
print("圓周長:",PI*r*2) #公式:PIx半徑x2
print("球的體積:",PI*r**3*4/3) #公式:PIx半徑x半徑x半徑x4/3說明
- 第 2 行: 圓周率通常定義為不變的常數,變數名稱會用大寫字母和 _ 組成。
- 第 4、6行:
r**2和r**3分別代表半徑的平方和三次
3. 複合指定運算子
在程式中若需要將某個變數值運算後,再將運算結果指定給該變數時,可以利用複合指定運算子來簡化敘述。例如將 x 變數值加 5,再指定給 x 變數寫法為:
x = 5因為指定運算子(=)的左右邊都有相同的變數 x,此時可以使用複合指定運算子來簡化敘述,程式寫法改為:
x += 5使用複合指定運算子時,變數必須先宣告否則會產生錯誤。常用的複合運算子:
| 運算子 | 功能 | 範例 | 結果(x 變數值原為 3) |
|---|---|---|---|
+= | 相加後再指定 | x += 2 (x = x + 2) | x 變數值為 5 |
-= | 相減後再指定 | x -= 2 (x = x - 2) | x 變數值為 1 |
*= | 相乘後再指定 | x *= 2 (x = x * 2) | x 變數值為 6 |
/= | 浮點數相除後再指定 | x /= 2 (x = x / 2) | x 變數值為 1.5 |
//= | 整數相除後再指定 | x //= 2 (x = x // 2) | x 變數值為 1 |
%= | 相除取餘數後再指定 | x %= 2 (x = x % 2) | x 變數值為 1 |
**= | 平方運算後再指定 | x **= 2 (x = x ** 2) | x 變數值為 9 () |
4. 關係運算子
關係運算子可以對兩個運算元作比較,並傳回比較結果。如果比較的結果是成立,傳回值為True;若不成立傳回值為False。
關係運算子常配合if等選擇結構,來決定程式的流向。
| 關係運算子 | 功能 | 數學表示式 | 範例 | 結果(若 x = 1、y = 2) |
|---|---|---|---|---|
== | 等於 | x = y | x == y | False (假) |
!= | 不等於 | x ≠ y | x != y | True (真) |
>= | 大於等於 | x ≥ y | x >= y | False (假) |
<= | 小於等於 | x ≤ y | x <= y | True (真) |
> | 大於 | x > y | x > y | False (假) |
< | 小於 | x < y | x < y | True (真) |
[例] 練習各種關係運算子的運算: (檔名:relation.py)
a,b=2,3
print('a = 2, b = 3') # 輸出: a = 2, b = 3
print('a < b = ',a < b) # 輸出: True
print('a >= b = ',a >= b) # 輸出: False
print('a == b', a==b) # 輸出: False5. 邏輯運算子
邏輯運算子(Logical Operator) 屬於二元運算子,可以對兩個運算元作邏輯運算,並傳回運算結果。下表列出 Python 語言提供邏輯運算子的各種運算結果:
x | y | x and y | x or y | not x | not y |
|---|---|---|---|---|---|
True | True | True | True | False | False |
True | False | False | True | False | True |
False | True | False | True | True | False |
False | False | False | False | True | True |
Python 語言在做邏輯運算時,會採取快捷(Short Circuit)運算,來加快執行速度。
在Python中not運算的傳回值布林值,但是and 和or 運算的傳回值不一定為布林值,而是會傳回適當的運算元值。例如and運算時若第一個運算元為False,就傳回第一個運算元值;否則傳回第二個運算元值。下表為Python 邏輯運算子的運算邏輯:
| 邏輯運算子 | 功能 | 範例 | 說明 |
|---|---|---|---|
and | 且 | x and y | 若 x 為假時傳回 x;x 為真時傳回 y。 |
or | 或 | x or y | 若 x 為真時傳回 x;x 為假時傳回 y。 |
not | 非 | not x | 若 x 為假時傳回 True;x 為真時傳回 False。 |
邏輯運算子可以用來測試較複雜的條件,常常用來連結多個關係運算子。例如:
(score>= 0)and(score<=100),其中(score >= 0)和(score<=100)為關係運算子,兩者用and(且)邏輯運算子連接,表示兩個條件都要成立才為真,所以上述表示score 要介於 0 ~100。邏輯運算子常結合關係運算子,在if等選擇結構中決定程式的流向。
[例] 下列為邏輯運算子的範例:(檔名:logical.py)
print((1 < 2) and ('A' == 'a')) # False (前者為真後者為假,and 必須兩者皆真才為真)
print((-1 < 0) or (-1 > 100)) # True (前者為真後者為假,or 只要一個為真就為真)
print(not('A' != 'a')) # False ('A' != 'a' 為真,所以做 not 運算後結果為假)
print(not 2) # False (因為 2 不是 0, 所以為 True,做 not 運算後結果為 False)
print(2 and 3) # 3(and 運算因第一個運算元 2 是真<非 0 為真>),傳回第二個運算元 3
print(2 or 3) # 2(or 運算因第一個運算元 2 是真,傳回第一個運算元 2
print('a' or 'b') # a(or 運算因第一個運算元 a 是真<非空字串為真>,所以直接傳回 a
print(0 and 3) # 0(and 運算因第一個運算元 0 是假,傳回第一個運算元 0
print('' or 'b') # b(or 運算因第一個運算元 '' 空字串是假,所以傳回第二個運算元 'b'6. 位元運算子
& (And,且)、| (Or,或)、^ (Xor,互斥) 及 ~ (Not,非) 為位元運算子,做法是先將運算元轉換成二進位,接著做指定的二進位布林運算。
位元運算子的運算方式如下表所示:
| A | B | A & B | A | B | A ^ B | ~A |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 | 1 |
| 說 | 明 | & (And,且) 運算時,兩者皆為 1 才會是 1。 | | (Or,或) 運算時,只要一個為 1 就會是 1。 | ^ (Xor,互斥) 運算時,只要兩者不同就會是 1。 | ~ (Not,非) 運算時,1 變成 0;0 變成 1。 |
上表中 ^(Xor)為互斥邏輯運算,表示兩個二進制的位元作互斥運算,若 A 或 B 值相同時結果為0,即兩者都為 0或都為1時;若A和B值不相同時結果為1,即一個為0另一個為1。
[例] 下列為位元運算子的範例:(檔名:bitwise.py)
print(5 & 3) # 輸出為: 1
print(5 | 3) # 輸出為: 7
print(5 ^ 3) # 輸出為: 6
print(~5) # 輸出為: -6(為 5 的補數)
7. in 與 is 運算子
in 和 not in 稱為成員運算子,in 用來判斷第一個運算元是否為第二個運算元的元素,若是就回傳True;否則回傳False。
not in 運算子用來判斷第一個運算元是否不屬於第二個運算元的元素。
第二個運算元為字串、陣列…等物件。
[例] 下列為成員運算子的範例:(檔名:in.py)
print('P' in 'Python') # 'P' 是否包含在 'Python' 中。 結果 True ('P' 包含在 'python' 字串中)
print('x' not in 'Python') # 'x' 是否不包含在 'Python' 中。 結果 True ('x' 包含在 'python' 字串中)
print(1 in [1,2,3]) # 1 是否包含在 [1,2,3] 陣列中。 結果 True (1 包含在 [1,2,3] 的陣列中)
print(2 not in [1,2,3]) # 2 是否不包含在 [1,2,3] 陣列中。 結果 False (2 包含在 [1,2,3] 陣列中)is 和 not is 稱為身分運算子,is用來判斷兩運算元的id(記憶體位址)是否相同,若是就回傳True;否則回傳False。所以xisy 敘述,就等於id(x)==id(y)敘述。not is 運算子用來判斷兩運算元是否引用自同一個物件,而==運算子則是判斷兩運算元的值是否相同。
[例] 下列為成員運算子的範例:(檔名:is.py)
import decimal
x=2.5; y=2.5
print(id(x),id(y)) # 印出 x、y 變數儲存的記憶體位址 -> 2208393104976 2208393104976
print(x is y, x == y) # 結果 True (位址相同)、 True(值相同)
z=decimal.Decimal('2.5') # 將 2.5 物件轉換成 Decimal 資料型態
print(id(z)) # 印出 z 變數位址。 -> 2208393607856
print(z is x, z == x) # 結果 False(位址不同)、True(值相同)8. 位移運算子
移位運算子(Shift Operator)可用來做數值運算,做法是先將指定的運算元轉成二進制,接著再使用 ”>>” 右移運算子指定該運算元往右移幾個位元(bit),或是使用 ”<<” 左移運算子指定該運算元往左移幾個位元。
>>1表右移一個位元,運算元等於除以 2,>>2表右移兩個位元,運算元等於除以4,其餘可類推。<<1表左移一個位元,運算元等於乘以2,<<2表左移兩個位元,運算元等於乘以4,其餘類推。
[例] 下列為位移運算子的範例:(檔名:shift.py)
print(20>>1) # 結果 10
print(20<<1) # 結果 409. 運算子的優先順序
- 運算式原則由左至右依序運算,但有些運算子優先權較高必須先處理
- 運算式使用 () 左右括號,不但可以減少運算錯誤並增加可讀性,而且可以改變運算的順序。
| 優先次序 | 運算子 (Operator) |
|---|---|
| 1 | () (括弧) |
| 2 | ** (次方) |
| 3 | + (正號)、- (負號)、not (非)、~ (非) |
| 4 | % (取餘數)、// (整數除法)、/ (浮點數除法)、* (乘) |
| 5 | + (加)、- (減) |
| 6 | << (左移)、>> (右移) |
| 7 | & (且)、| (或)、^ (互斥) |
| 8 | < (小於)、<= (小於等於)、> (大於)、>= (大於等於)、!= (不等於)、== (等於) |
| 9 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, != (指定、複合指定運算子) |
| 10 | in (包含於)、not in (不包含於)、is (位址相同)、is not (位址不同) |
| 11 | and (且)、or (或) |

相關主題與延伸閱讀
- 3. 變數與資料型別:運算子的運算元通常就是變數或常值。
- 2. 常值:常值與變數搭配運算子即可組成完整的運算式。
- 5. 資料型別轉換:不同資料型別運算時,會牽涉到自動與強制型別轉換。
- 2. 關係運算式:關係運算子常搭配選擇結構使用,本篇有更深入的介紹。
- 3. 邏輯運算式:邏輯運算子常用來連結多個關係運算式,組成複雜的條件判斷。