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