Operations
2018.07.24
2018.07.24
不同類別的資料能進行的處理 (運算) 不同,在此我們先針對數字 (整數,浮點數) 的運算做討論。在此會討論的運算分為三類:算術運算、比較運算以及邏輯運算。我們將一一說明每類運算的「運算元」、「運算子」以及「運算結果」。後續的章節將會陸續討論其他類的運算。
常見的加 (+) 減 (-) 乘 (*) 除 (/) 即屬於此類運算。我們先以這幾個常見的運算子為例,來說明能夠擔任運算元東西;另外,我們也會討論到「重複指定 (reassignment)」的概念。
如同使用電子計算機,此類二元運算的語法為
運算元 運算子 運算元
例如 1 + 2 這個算式中,1 與 2 皆為運算元,+ 為運算子。在 python shell 中的執行結果如下:
>>> 1 + 2
3
>>> 6 * 5
30
>>> 3 - 7
-4
>>> 5 / 2
2.5
在此我們可以先注意一件事,Python 的程式雖然不允許隨意在行首加空白,但在行末或行中是允許的;利用這個特性,我們可在程式語句中適當的加上空白,以增加可讀性。比較:
>>> 1+2
>>> 1 + 2
>>> 3.14*(5+2)*(5+3)
>>> 3.14 * (5 + 2) * (5 + 3)
運算元的部分,除了直接放置數字之外,我們也可以放置類別為整數/浮點數的變數,例如:
>>> x = 2
>>> x + 3
5
>>> x = 3.5
>>> x + x
7.0
重覆指定
由上面的例子,我們可以觀察到變數是可以重覆使用的,像是可撕下來再貼至別處的標籤,這種改變變數「值」的動作,我們稱為「重覆指定 (reassignment)」。
(回憶) 若我們希望將計算的結果保存以利後續取用,我們可利用「指定」。例如,我們想將 1 + 2 的運算結果存至記憶體,並在該儲存格貼上一名為 x 的標籤,我們可用下面的指令:
>>> x = 1 + 2
配合重覆指定的概念,我們可以寫出如下的語句:
>>> x = 5
>>> x = x + x
注意,此處的「=」並非數學上的等號,而是「指定」,讓我們套用先前討論指定時的解讀方式:
Python 會將計算完成的值存放至記憶體的某處,並將名為 x 的標籤貼至該處。電子計算機上的 M+, M- 功能,和重覆指定的概念相同。
其他算術運算
除了變數與實際值之外,運算元也可為函式 (function) 的回傳值,如
>>> x = int(input()) + 3
5
>>> print(x)
8
我們在後續討論函式的章節會再做討論。
除了前述的四則運算,常用的二元算術運算還有取商「//」、取餘數「%」、以及冪次「**」,我們直接用下面的例子說明。
>>> x = 5 // 3
>>> print(x)
1
>>> type(x)
<class ‘int’>
>>>
>>> x = 5 % 3
>>> print(x)
2
>>> type(x)
<class ‘int’>
>>>
>>> x = 5 ** 3
>>> print(x)
125
運算子的優先權
如同四則運算具有「先乘除,後加減」的原則,一般的程式語言也都會依循這樣的原則。針對前述六個運算子,Python 的處理次序為
** ----> *, /, %, // ----> +, -
注意,當我們將「-」視為負號而非減法算子時,其優先權僅低於冪次算子。例:
>>> -1 ** 2
-1
當我們對於運算先後次序有疑問時,最好的方式就是利用小括號「( )」,小括號中的算式將優先被求值,而後才會執行括號外的算子。
當一個算式中具有多個算子時,算子的執行順序會依照前述的優先權;若遇到優先權相同的算子,執行的順序為「由左而右」,僅有冪次算子例外 (由右而左)。例:
>>> 2 ** 2 ** 0
2
>>> (2 ** 2) ** 0
1
故名思義,此類運算比較兩數值的大小, 運算結果僅會是 True 或 False (類別為 bool,稱做布林值,後續會再做討論)。共有六個比較運算 (>,<,>=,<=,==,!=):
在 Python 中,一個算式中是允許出現多個比較運算的,如:
>>> 1 < 2 <= 5
True
>>> 1 == 0 + 1 != 2
True
當一個式子中包含數個比較運算時,各個比較算子會取其左右之運算元求值,若所有結果皆為 True,則求值為 True;只有要一個為 False 所求之值即為 False。
邏輯運算子有三,and、or、not。其中 and 與 or 為二元運算,not 為一元運算。邏輯運算的運算元以及運算結果皆為布林值,各運算的語意如下:
邏輯運算以及比較運算在程式設計中非常常用,程式中「判斷」語句的執行或是「迴圈」是否要繼續通常都仰賴這兩類運算的結果,我們將在後續的章節討論。
運算優先權
上述的三類運算,以算術運算優先權最高,比較運算次之,邏輯運算優先權最低。邏輯運算中,not 的優先權高於其他二者。
>>> not False and False
False
>>> not (False and False)
True
布林值
類別為 bool 的值僅有 True 與 False;在 Python 中,bool 其實是 int 的子類別,True 為 1,False 為 0。
>>> 0 == False
True
>>> 1 == True
True
>>> 2 == True
False
>>> -1 == False
False
我們可以 True 和 False 分別當成 1 和 0,進行算術與比較運算;相對地,在 Python 中我們也能夠對數字進行邏輯運算,然而這樣的做法會讓運算子失去原本應有的特性,導致語句失去其語意 (或降低程式可讀性),建議避免此類的用法。
例:
>>> (-1 and 1) == True
True
>>> (1 and -1) == True
False