運算子

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

若按照運算所需要的運算元數目來分類,可分成:

  1. 一元運算子: -(負),如: -5。
  2. 二元運算子: +、-、*、/、+=…等,如: x + y、x / y。

Python語言所提供的常用運算子,有指定、算術、複合指定、關係、邏輯、位元、移位、成員、身分運算子。

1. 指定運算子

宣告變數指定初值,或是要改變數值時,可以使用指定運算子「=」。指定時可以將一個常值、變數或運算式的結果,語法為:

變數名稱 = 常值 | 變數  | 運算式

Python語言中,intfloatstring…等資料型別是屬於不可變物件,變數值是不會改變。如果變數值改變時,會先將變數複製到新記憶體位址才改變變數值。

在其他程式語言中要交換兩個變數值時,程式寫法為 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))

說明

  1. 第3行:使用 id() 函式,可以取得物件使用的記憶體位址。執行時會發現 x 和 y 變數會使用同一個記憶體位置,因為在第 2 行指定 y=x,此時會將 x 變數的記憶體位址傳給y變數,x和y變數的記憶體位址相同所以變數值會相同。
  2. 第 4 行:在第 4 行改變 x 變數的值,此時就會使用新的記憶體位址來存放 x 變數,而 y 變數的記憶體位址維持不變。
  3. 第 8 行:將 a 和 b 兩變數的變數值相互交換。
  4. 第 9 行:顯示 a 和 b 兩變數的記憶體位址時,會發現 a 和 b 兩變數的記憶體位址會交換,就能達到變數數值交換的效果。

2. 算術運算子

算術運算子可以用來執行數學運算,包括加法、減法、乘法、除法、取餘數…等。下表為Python語言常用的算術運算子:

運算子功能說明範例結果(假設 y = 5
+加法x = y + 2x 變數值為 7
-減法x = y - 2x 變數值為 3
*乘法x = y * 2x 變數值為 10
/浮點數除法x = y / 2x 變數值為 2.5
//整數除法x = y // 2x 變數值為 2
%取除法的餘數x = y % 2x 變數值為 1
**次方(指數)x = y ** 2x 變數值為 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

說明

  1. 第 2 行: 圓周率通常定義為不變的常數,變數名稱會用大寫字母和 _ 組成。
  2. 第 4、6行:r**2r**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 = 1y = 2
==等於x = yx == yFalse (假)
!=不等於x ≠ yx != yTrue (真)
>=大於等於x ≥ yx >= yFalse (假)
<=小於等於x ≤ yx <= yTrue (真)
>大於x > yx > yFalse (假)
<小於x < yx < yTrue (真)

[例] 練習各種關係運算子的運算: (檔名: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)     # 輸出: False

5. 邏輯運算子

邏輯運算子(Logical Operator) 屬於二元運算子,可以對兩個運算元作邏輯運算,並傳回運算結果。下表列出 Python 語言提供邏輯運算子的各種運算結果:

xyx and yx or ynot xnot y
TrueTrueTrueTrueFalseFalse
TrueFalseFalseTrueFalseTrue
FalseTrueFalseTrueTrueFalse
FalseFalseFalseFalseTrueTrue

Python 語言在做邏輯運算時,會採取快捷(Short Circuit)運算,來加快執行速度。
Pythonnot運算的傳回值布林值,但是andor 運算的傳回值不一定為布林值,而是會傳回適當的運算元值。例如and運算時若第一個運算元為False,就傳回第一個運算元值;否則傳回第二個運算元值。下表為Python 邏輯運算子的運算邏輯:

邏輯運算子功能範例說明
andx and yx 為假時傳回 xx 為真時傳回 y
orx or yx 為真時傳回 xx 為假時傳回 y
notnot xx 為假時傳回 Truex 為真時傳回 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,非) 為位元運算子,做法是先將運算元轉換成二進位,接著做指定的二進位布林運算。
位元運算子的運算方式如下表所示:

ABA & BA | BA ^ B~A
111100
100110
010111
000001
& (And,且) 運算時,兩者皆為 1 才會是 1。| (Or,或) 運算時,只要一個為 1 就會是 1。^ (Xor,互斥) 運算時,只要兩者不同就會是 1。~ (Not,非) 運算時,1 變成 0;0 變成 1。

上表中 ^(Xor)為互斥邏輯運算,表示兩個二進制的位元作互斥運算,若 A 或 B 值相同時結果為0,即兩者都為 0或都為1時;若AB值不相同時結果為1,即一個為0另一個為1

[例] 下列為位元運算子的範例:(檔名:bitwise.py)

print(5 & 3)  # 輸出為: 1
print(5 | 3)  # 輸出為: 7
print(5 ^ 3)  # 輸出為: 6
print(~5)     # 輸出為: -6(為 5 的補數)

7. in 與 is 運算子

innot 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] 陣列中)

isnot 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)  # 結果 40

9. 運算子的優先順序

  1. 運算式原則由左至右依序運算,但有些運算子優先權較高必須先處理
  2. 運算式使用 () 左右括號,不但可以減少運算錯誤並增加可讀性,而且可以改變運算的順序。
優先次序運算子 (Operator)
1() (括弧)
2** (次方)
3+ (正號)、- (負號)、not (非)、~ (非)
4% (取餘數)、// (整數除法)、/ (浮點數除法)、* (乘)
5+ (加)、- (減)
6<< (左移)、>> (右移)
7& (且)、| (或)、^ (互斥)
8< (小於)、<= (小於等於)、> (大於)、>= (大於等於)、!= (不等於)、== (等於)
9=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, != (指定、複合指定運算子)
10in (包含於)、not in (不包含於)、is (位址相同)、is not (位址不同)
11and (且)、or (或)


相關主題與延伸閱讀

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