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)
+ | 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
+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 。
@@ -1066,123 +1074,123 @@ Logical 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))
+ | 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
+ouput |
---|
| a=0b10
+b=0b11
+2 0b10
+3 0b11
+1 0b1
+-3 -0b11
+4 0b100
+1 0b1
|
-& 是位元的 and , | 是位元的 or , ^ 是位元的 xor , ~ 是位元的 not , << 是位元的左移, >> 是位元的右移。
+& 是位元的 and , | 是位元的 or , ^ 是位元間的進行互斥或運算, ~ 是位元的 not , << 是位元的左移, >> 是位元的右移。
在往下之前,請你先想想我們該如何判斷一個數字是奇數還是偶數,我們可以用 % 來判斷,但是我們也可以用位元運算來判斷。
- | a, b = 5678, 4843
-print(f"Is a even? {a % 2 == 0}")
-print(f"Is b odd? {b & 1 == 1}")
+ | 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
+ouput |
---|
| Is a even? True
+Is b odd? True
|
Question
- 如何判斷一個數字是
2 的冪?
-- 如何讓一個數字變成自己的 16 倍,但不能用
* 乘法運算子?
+- 如何得到一個數字的 16 倍,但不能用
* 乘法運算子?
Assignment Operators
我們已經學會了一些運算子,現在我們要來學習一些指派運算子,他可以將運算結果指定給變數。
先來看看一個簡單的例子,我們可以用 += 來將變數加上某個值,這個運算子可以讓我們的程式碼更簡潔。
- | x = 1
-x = x + 2
-y = 1
-y += 2
-print(x, y)
+ | x = 1
+x = x + 2
+y = 1
+y += 2
+print(x, y)
|
-ouput |
---|
| 3 3
+
再來看看其他的指派運算子。
- | 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 = 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)
|
-ouput |
---|
| 3
-2
-6
-3
-9
-18
+
對了,請你別忘記 = 也是一個指派運算子。
- | x = y = z = 1
-print(x, y, z)
+ | x = y = z = 1
+print(x, y, z)
|
-ouput |
---|
| 1 1 1
+
希望這個例子可以讓你更熟悉指派運算子。
@@ -1196,36 +1204,36 @@ Bonus: f-string for float
|
|
|
|
|
|
|
|
|
|
|