「程式世界很簡單,只有兩種狀態:True 或 False。」
「但問題是,怎麼判斷哪個是真的、哪個是假的呢?」
在前幾天的學習中,我們先認識了 變數與資料型別,知道可以把不同型別的資料存放到變數裡。
昨天(Day6)則玩了各種數字、文字的運算對吧!
但是,程式並不只要會算,它還要能「判斷」。
想想看,這些問題是不是更貼近「現實生活」:
畢竟程式的出現,就是要解決日常生活中的困擾吧?
今天,我們就要正式進入 關係與邏輯判斷的世界。
我們會先認識 (關係)比較運算子,用來比較大小、檢查相等;
再學習 邏輯運算子,用來組合多個條件。
這些工具將會是未來 if 條件判斷 的基石,讓程式能夠根據不同情況做出選擇。
運算子 | 說明 | 範例 | 結果 |
---|---|---|---|
== |
等於 | 5 == 5 |
True |
!= |
不等於 | 5 != 3 |
True |
> |
大於 | 7 > 4 |
True |
>= |
大於或等於 | 7 >= 7 |
True |
< |
小於 | 3 < 8 |
True |
<= |
小於或等於 | 3 <= 2 |
False |
in |
是否存在於序列中 | 'a' in 'cat' |
True |
not in |
是否不存在於序列 | 'z' not in 'cat' |
True |
is |
是否指向同一個物件 | x is y |
視情況 |
is not |
是否不是同一物件 | x is not y |
視情況 |
=
vs ==
初學者最常遇到的 bug,就是搞錯「賦值」跟「比較相等」。
x = 5 # 把 5 存進 x,這叫「賦值」
print(x) # 輸出 5
print(x == 5) # True,因為 x 的值等於 5
print(x = 5) # 錯誤!這裡不能用賦值
💡 小提醒:
=
用來「指定」變數的值。==
用來「判斷」兩個值是否相等。我們先來看個生活化的例子!
假設你去 ATM 提款,輸入的密碼必須跟設定密碼相符,才能進入下一步。
password = "1234"
user_input = input("請輸入密碼: ")
if user_input == password:
print("密碼正確,歡迎使用 ATM!")
else:
print("密碼錯誤,請重新輸入。")
這裡就用到了比較運算子 ==
,
幫我們判斷「輸入的密碼」是不是跟「設定密碼」一樣。
我這邊有另外做一張投影片解釋「關係vs邏輯」!可以參考一下~
我們來看一下範例:(可以發現在關係運算上面的輸出結果會是布林值!)
a = 10
b = 7
print(a > b) # True
print(a == b) # False
print(a != b) # True
布林值也可以參與比較,True
會被視為 1,False
會被視為 0:
a = True
b = False
print(a == b) # False,True 不等於 False
print(a != b) # True,兩者不同
print(a > b) # True,True>False 相當於 1>0
print(a >= b) # True,1 >= 0
print(a < b) # False,1<0 不成立
print(a <= b) # False,1<=0 不成立
上面介紹的關係運算子是屬於「數值」層面的,
接下來我會再多介紹有關「序列關係運算」以及「物件類別關係運算」。
有時候我們想知道,一個元素是不是存在於某個集合(list、字串、tuple…)裡,
這時候就用 in
或 not in
。
符號 | 說明 | 範例 | 結果 |
---|---|---|---|
in |
判斷元素是否存在 | "a" in "apple" |
True |
not in |
判斷元素是否不存在 | "b" not in "apple" |
True |
範例:字串與清單
word = "apple"
print("a" in word) # True,因為 "a" 在 "apple" 裡
print("b" not in word) # True,因為 "b" 不在 "apple" 裡
fruits = ["apple", "banana", "cherry"]
print("banana" in fruits) # True,因為banana有出現在fruits這個list
print("orange" not in fruits) # True,因為orange沒有出現在fruits這個list
is
與 is not
用來判斷 兩個物件是否為同一個物件(比的是記憶體位址),而不是單純值相等。
符號 | 說明 | 範例 | 結果 |
---|---|---|---|
is |
是否為同一個物件 | a is b |
True / False |
is not |
是否不是同一個物件 | a is not b |
True / False |
我們來看一下範例:
x = [1, 2, 3]
y = [1, 2, 3]
z = x
print(x == y) # True,因為內容一樣
print(x is y) # False,雖然值相同,但記憶體位置不同
print(x is z) # True,因為 z 指向的就是 x
print(x is not y) # True
💡 小提醒:
==
比較的是「值是否相等」is
比較的是「是不是同一個物件」這兩個常常被新手搞混!(我也踩過這個坑)
光會比較還不夠,生活中的問題通常更複雜。
例如:「我今天有沒有時間看電影?」可能取決於兩件事:
這時候,我們就需要 邏輯運算子 來把條件組合在一起。
我一樣做了一個統整的slide給大家做參考!
(可以參考一下表格下方的紅字(口訣)!到目前爲止我也都是這樣背)
運算子 | 說明 | 範例 | 結果 |
---|---|---|---|
and |
兩者都為真,結果才為真 | True and False |
False |
or |
只要有一個為真,結果就為真 | True or False |
True |
not |
將布林值反轉 | not True |
False |
範例:
a = True
b = False
print(a and b) # False,因為兩個條件不全為真
print(a or b) # True,只要一個為真即可
print(not a) # False,把 True 反轉成 False
Python 沒有內建關鍵字 xor
,但我們可以用 位元運算子 ^
來達到布林的互斥或效果:
True
False
運算子 | 說明 | 範例 | 結果 |
---|---|---|---|
^ |
XOR,僅一真一假時才為真 | True ^ False |
True |
a = True
b = False
c = True
print(a ^ b) # True,一真一假
print(a ^ c) # False,因為兩個都 True
print(b ^ b) # False,因為兩個都 False
💡 小提醒:
^
在數字中是「位元 XOR」,但套用在布林值上,也能達成我們想要的「互斥或」。xor
常用在「只能選一個」的邏輯,例如:會員登入方式(用 Google 或 Facebook 登入,但不能兩個同時)。接下來,我們來一起看範例!
我們來檢查四個人的身高,看看誰的身高是否介於 180 到 185 公分之間;
同時也檢查體重是否符合標準範圍(70 到 90 公斤之間)。
# 四個人的身高 (公分)
h1, h2, h3, h4 = 175, 180, 184, 190
print(h1 >= 180 and h1 <= 185) # False,175 不在範圍內
print(h2 >= 180 and h2 <= 185) # True,180 在範圍內
print(h3 >= 180 and h3 <= 185) # True,184 在範圍內
print(h4 >= 180 and h4 <= 185) # False,190 太高了
# 四個人的體重 (公斤)
w1, w2, w3, w4 = 95, 85, 75, 65
print(70 < w1 < 90) # False,95 超標
print(70 < w2 < 90) # True,85 剛剛好
print(70 < w3 < 90) # True,75 剛好符合
print(70 < w4 < 90) # False,65 太輕了
接下來,我們把「not」跟「and / or」搭配起來玩一玩:
# 四個人的身高、體重
h1, h2, h3, h4 = 172, 179, 183, 188
w1, w2, w3, w4 = 92, 85, 78, 68
print(not h2 < 180)
# True,因為 h2=179,不滿足 <180 → 反轉後為 True
print(not h3 < 180)
# True,183 本來就 >180,反轉後仍然 True
print(not (h1 > 180 and w1 < 80))
# True,因為 h1>180 不成立 → and 為 False → not 變 True
print(not h2 > 180 or not w2 < 80)
# True,h2=179 不大於180 → not True → or 判斷整體為 True
print(not (h3 > 180 or w3 < 80))
# False,因為 h3=183>180 → or 為 True → not False
print(not h4 > 180 and not w4 < 80)
# False,h4=188>180 → not False;w4=68<80 → not False;最後 and False
今天我們正式進入了程式設計裡「邏輯思考」的領域。
從 比較運算子(==, !=, >, <, in, is
…)到 邏輯運算子(and, or, not, xor
),你會發現 Python 不只會算數學,還能幫我們回答各種「是或否」的問題。
程式的力量就在這裡 —— 它不只是計算,還能幫我們「做判斷」,替我們思考。
今天我們玩的練習題,就像在幫一群人做健康檢查一樣:
程式自動判斷身高、體重是否在標準範圍,甚至還能反轉條件(用 not
),就好像醫師說「雖然超過180公分,但體重沒有過輕就算合格」。
這樣的邏輯組合,在未來的專案中會非常常見完全離不開!!
掌握了這些運算子之後,你已經有能力開始「寫出會思考的程式」了。
回想當初自己第一次學這些比較與邏輯運算子的時候,真的是一團亂。
最常犯的錯就是把 =
跟 ==
搞混,原本只是想要「比較」,結果卻寫成「賦值」,程式直接報錯。
那時候心裡超崩潰!!
更崩潰的是後面還遇到 and
、or
、not
、甚至 xor
。
但後來我慢慢發現,其實這些東西在很多情境都會用到:
not
,常常能幫忙處理「反向」的邏輯,少寫很多程式碼。雖然一開始真的很混亂,但現在回頭看,這些比較與邏輯運算子就像是「程式的大腦」。
只要我下對指令,程式就能像小機器人一樣,幫我思考、幫我判斷。
而這種感覺,真的是從單純做數學計算,進化到能寫「有智慧的程式」的關鍵轉折。
Day8,我們要正式進入 if 條件判斷!
這會是你把「邏輯判斷」真正活用的第一步。
if
的基本寫法if-else
的選擇邏輯elif
的多重判斷更重要的是,我們會寫出第一個「能替你決定事情」的小程式,例如:
自動判斷一個分數是否及格
根據分數等級給出評語(A、B、C…)
判斷輸入的數字是奇數還是偶數
到了明天,你就會發現:
程式已經不再只是「輸入→計算→輸出」,而是開始像個「小助理」,能根據狀況替你選擇。
那麼我們就明天見囉!如果有任何問題,歡迎在底下留言~
若覺得內容還不錯的話!也可以幫我點個like,你們的支持也是我最大的動力~