Operators¶
Introduction¶
在這個章節中,我們要來學習運算子,運算子可以讓我們對變數做運算,例如: 加法、減法、乘法、除法等等。
Arithmetic Operators¶
首先,我們來看看算術運算子,我們熟悉的四則運算就是算術運算子,他們分別是 +、-、*、/,分別代表加法、減法、乘法、除法。
我相信看完輸出後,你能大致明瞭各個運算子的作用,其中想請你留意 * 乘法運算子,請你不要打成 x,以及 / 與 // 的差別,後者會將結果向下取整。還有比較特別的 % ,留意到 10 = 3 * 3 + 1,就是取餘數;而看起來最奇特的 ** ,他的作用是求冪。
我們來複習一下國小數學:
這邊要提醒你的是,運算子之間有優先順序,當你不確定結果的時候,請善用括號。
| ouput | |
|---|---|
Martin Garrix - Animals (Official Video)
再請你留意一件事,不同類別對於運算子的作用是不同的,例如字串的 + 會將兩個字串相連,而整數的 + 則會將兩個整數相加。
Question
2 ** 3 ** 2的結果是多少?2 ** (3 ** 2)的結果是多少?(2 ** 3) ** 2的結果是多少?
Comparison Operators¶
比較運算子的結果會是 True 或 False,這個結果我們稱為布林值。
我們來以直角三角形的性質來做一些比較運算子的練習。
這邊要提醒你, == 是比較運算子,而 = 是指派運算子,他們的意思是不一樣的。
最後來看一個例子:
在Python中,我們可以將比較運算子連接起來,這樣的寫法可以讓我們的程式碼更簡潔。
Question
print(1 < 2 < 3 < 4 < 5)會印出什麼?print(1 < 2 < 3 < 4 > 5)會印出什麼?
Logical Operators¶
我們繼續往下看,這邊我們要介紹邏輯運算子,他可以將多個布林值結合成一個布林值。
這邊要提醒你的是, and 只有在所有布林值都是 True 的時候,結果才會是 True,而 or 只要有一個布林值是 True,結果就會是 True。
因此有所謂的短路求值(Short-circuit Evaluation),當 and 的第一個布林值是 False,後面的布林值就不會被計算,因為結果一定是 False;而 or 的第一個布林值是 True,後面的布林值就不會被評估,因為結果一定是 True。
而 not 是一元運算子,他只會將布林值反轉。
Question
print(not True and False)會印出什麼?print(not True or False)會印出什麼?print(not True and not False)會印出什麼?print(not True or not False)會印出什麼?
Bitwise Operators¶
在這邊我們要介紹位元運算子,他是對二進位的運算,我們可以用 bin() 來觀察二進位的結果。
& 是位元的 and, | 是位元的 or, ^ 是位元間的進行互斥或運算, ~ 是位元的 not, << 是位元的左移, >> 是位元的右移。
在往下之前,請你先想想我們該如何判斷一個數字是奇數還是偶數,我們可以用 % 來判斷,但是我們也可以用位元運算來判斷。
Question
- 如何判斷一個數字是
2的冪? - 如何得到一個數字的 16 倍,但不能用
*乘法運算子?
Assignment Operators¶
我們已經學會了一些運算子,現在我們要來學習一些指派運算子,他可以將運算結果指定給變數。
先來看看一個簡單的例子,我們可以用 += 來將變數加上某個值,這個運算子可以讓我們的程式碼更簡潔。
| ouput | |
|---|---|
再來看看其他的指派運算子。
對了,請你別忘記 = 也是一個指派運算子。
| ouput | |
|---|---|
希望這個例子可以讓你更熟悉指派運算子。
Question
- 有沒有
and=這個指派運算子? &=這個指派運算子的作用是什麼?
Bonus: f-string for float¶
為了能讓你練習一些題目,我先在這裡介紹如何印出浮點數到指定位數。
在 Say Hello to Python - Input 中,有稍微提過,如果你完全沒印象,請你回去複習一下。
給你浮點數 x ,請你印出 x 的平方根與平方,並且只印出小數點後兩位。
@EditTime : 2024-01-27 11:52
Bonus: map for input¶
再次複習 Variable and Input - Mutiple Input 中的例子,我們可以用 split() 來將輸入的字串切割成多個字串。
但是如果我們想要將這些字串轉換成整數,我們可以怎麼做呢?
| input | |
|---|---|
| ouput | |
|---|---|
雖然這樣寫也可以,但是如果我們想要輸入很多個數字,這樣寫就會很麻煩,這時候我們可以用 map() 來幫助我們。
| input | |
|---|---|
| ouput | |
|---|---|
map(function, iterable) 會將 iterable 中的每一個元素都丟進 function 中,在這裡的 iterable 是 input().split(),而 function 是 int,因此 map(int, input().split()) 會將 input().split() 中的每一個元素都轉換成整數。
你可以嘗試將使用別的函式,例如 float 或 str,但請你記得不要加上括號,因為我們只是要將函式的名稱傳進去,而不是要執行函式。
我們使用 Unpacking 的方式來將 map() 的結果指派給變數。我相信你還記得什麼是 Unpacking 吧?
如果你不太能理解,也沒關係,先學會怎麼用就好。
Practice¶
有了本章的基礎後,其實已經可以做很多題目了,我們來做一些練習題吧!
Itsa - [C_MM01-易] 計算梯型面積
Reference code
Itsa - [C_MM02-易] 計算三角形面積
Itsa - [C_MM04-易] 計算總和、乘積、差、商和餘數
Reference code
Itsa - [C_MM06-易] 英哩轉公里
Assignment¶
Itsa - [C_MM07-易] 計算平方值與立方值
Itsa - [C_MM08-易] 計算兩數和的平方值
Itsa - [C_MM10-易] 攝氏溫度轉華式溫度
Itsa - [C_MM11-易] 購票計算
Itsa - [C_MM12-易] 相遇時間計算
Itsa - [C_MM14-易] 計算時間的組合
@EditTime : 2024-01-28 22:03