+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Operators
+Arithmetic Operators
+我們已經會怎麼使用變數、自己輸入值、以及印出值,現在我們要來學習一些運算子,讓我們可以對變數做一些運算。
+x , y = 10 , 3
+print ( x + y )
+print ( x - y )
+print ( x * y )
+print ( x / y )
+z = x // y
+print ( z )
+print ( type ( z ))
+print ( x % y )
+print ( x ** y )
+
+ouput 13
+ 7
+ 30
+ 3.3333333333333335
+ 3
+ <class 'int'>
+ 1
+ 1000
+
+我相信看完輸出後,你能大致明瞭各個運算子的作用,其中想請你留意 *
乘法運算子,請你不要打成 x
,以及 /
與 //
的差別,後者會將結果向下取整。還有比較特別的 %
,留意到 10 = 3 * 3 + 1
,就是取餘數;而看起來最奇特的 **
,他的作用是求冪。
+我們來複習一下國小數學:
+
# Upper case for constant
+PI = 3.14
+r = 2
+area = PI * ( r ** 2 )
+perimeter = 2 * PI * r
+print ( f 'Area: { area } , Perimeter: { perimeter } ' )
+
+# Sum of 1 to 100
+total = ( 1 + 100 ) * 100 // 2
+print ( f 'The sum of 1 to 100 is { total } ' )
+
+ouput Area: 12.56, Perimeter: 12.56
+ The sum of 1 to 100 is 5050
+
+這邊要提醒你的是,運算子之間有優先順序,當你不確定結果的時候,請善用括號。
+
+
Question
+
+2 ** 3 ** 2
的結果是多少?
+2 ** (3 ** 2)
的結果是多少?
+(2 ** 3) ** 2
的結果是多少?
+
+
+Comparison Operators
+比較運算子的結果會是 True
或 False
,這個結果我們稱為布林值。
+我們來以直角三角形的性質來做一些比較運算子的練習。
+a , b , c = 3 , 4 , 5
+
+print ( a < b )
+print ( a > b )
+print ( a <= b )
+print ( a >= b )
+print ( a ** 2 + b ** 2 == c ** 2 )
+print ( a ** 2 + b ** 2 != c ** 2 )
+print (( a + b ) > c )
+
+ouput False
+ True
+ False
+ True
+ False
+ True
+
+這邊要提醒你, ==
是比較運算子,而 =
是指派運算子,他們的意思是不一樣的。
+最後來看一個例子:
+
age = 14
+print ( 12 <= age <= 18 )
+
+x , y , z = 1 , 2 , 3
+print ( x < y < z )
+print ( x < y and y < z )
+
+
+在Python中,我們可以將比較運算子連接起來,這樣的寫法可以讓我們的程式碼更簡潔。
+
+
Question
+
+print ( 1 < 2 < 3 < 4 < 5 )
會印出什麼?
+print ( 1 < 2 < 3 < 4 > 5 )
會印出什麼?
+
+
+Logical Operators
+我們繼續往下看,這邊我們要介紹邏輯運算子,他可以將多個布林值結合成一個布林值。
+has_license = True
+is_drunk = False
+age = 18
+
+print ( f "Can I drive a car? { has_license and not is_drunk and age >= 18 } " )
+print ( not has_license )
+print ( not is_drunk )
+print ( age >= 18 or is_drunk or not has_license )
+
+ouput Can I drive a car? True
+ False
+ True
+ True
+
+這邊要提醒你的是, 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()
來觀察二進位的結果。
+a , b = 2 , 3
+print ( f "a= { bin ( a ) } " )
+print ( f "b= { bin ( b ) } " )
+
+print ( a & b , bin ( a & b ))
+print ( a | b , bin ( a | b ))
+print ( a ^ b , bin ( a ^ b ))
+print ( ~ a , bin ( ~ a ))
+
+print ( a << 1 , bin ( a << 1 ))
+print ( a >> 1 , bin ( a >> 1 ))
+
+ouput a=0b10
+ b=0b11
+ 2 0b10
+ 3 0b11
+ 1 0b1
+ -3 -0b11
+ 4 0b100
+ 1 0b1
+
+&
是位元的 and
, |
是位元的 or
, ^
是位元的 xor
, ~
是位元的 not
, <<
是位元的左移, >>
是位元的右移。
+在往下之前,請你先想想我們該如何判斷一個數字是奇數還是偶數,我們可以用 %
來判斷,但是我們也可以用位元運算來判斷。
+a , b = 5678 , 4843
+print ( f "Is a even? { a % 2 == 0 } " )
+print ( f "Is b odd? { b & 1 == 1 } " )
+
+ouput Is a even? True
+ Is b odd? True
+
+
+
Question
+
+如何判斷一個數字是 2
的冪?
+如何讓一個數字變成自己的 16 倍,但不能用 *
乘法運算子?
+
+
+Assignment Operators
+我們已經學會了一些運算子,現在我們要來學習一些指派運算子,他可以將運算結果指定給變數。
+先來看看一個簡單的例子,我們可以用 +=
來將變數加上某個值,這個運算子可以讓我們的程式碼更簡潔。
+x = 1
+x = x + 2
+y = 1
+y += 2
+print ( x , y )
+
+
+再來看看其他的指派運算子。
+x = 1
+x += 2
+print ( x )
+x -= 1
+print ( x )
+x *= 3
+print ( x )
+x //= 2
+print ( x )
+x **= 2
+print ( x )
+x <<= 1
+print ( x )
+
+
+對了,請你別忘記 =
也是一個指派運算子。
+x = y = z = 1
+print ( x , y , z )
+
+
+希望這個例子可以讓你更熟悉指派運算子。
+
+
Question
+
+有沒有 and=
這個指派運算子?
+&=
這個指派運算子的作用是什麼?
+
+
+Bonus: f-string for float
+為了能讓你練習一些題目,我先在這裡介紹如何印出浮點數到指定位數。
+給你浮點數 x
,請你印出 x
的平方根與平方,並且只印出小數點後兩位。
+x = 3.1415926
+print ( f "The square root of { x } is { x ** 0.5 : .2f } " )
+print ( f "The square of { x } is { x ** 2 : .2f } " )
+
+ouput The square root of 3.1415926 is 1.77
+ The square of 3.1415926 is 9.87
+
+@EditTime : 2024-01-27 11:52
+Practice
+
+
+
+
+
+
+
+
+
+
+
+
+
+