Day 4 條件判斷
引言
昨天我們學會了運算子,包括算術、比較、邏輯與賦值運算子。運算子能幫助我們比較資料、組合條件,但要讓程式「根據情況做出不同反應」,還需要把這些比較寫進決策流程中。條件判斷正是程式具備「判斷力」的關鍵,也是從被動執行走向主動反應的第一步。
這篇文章會帶你認識 Python 的條件判斷,從最基本的 if 開始,到 if...else、if...elif...else,再到巢狀條件與三元運算式。我們也會用一個「成績等第」的綜合範例,把這些語法實際應用在真實情境中,體會條件判斷如何讓程式變得更聰明。
if 語句:最基本的條件
在 Python 中,if 是最簡單的條件判斷。它會評估後面的運算式,若結果為 True,就執行縮排內的程式碼;若為 False,則直接跳過。
age = 20
if age >= 18:
print("你已經成年了")
print("程式結束")
執行程式會輸出「你已經成年了」與「程式結束」。注意 if 結尾有一個冒號 :,這是 Python 用來標示「接下來是縮排區塊」的語法;縮排的範圍就是條件成立時要執行的部分。Python 慣例使用 4 個半形空格作為縮排。
if...else:二選一
當條件只有兩種結果時,可以用 if...else。if 處理條件為 True 的情況,else 則負責處理剩下的所有情況,也就是條件為 False 的部分。
score = 55
if score >= 60:
print("及格")
else:
print("不及格")
因為 score 是 55,小於 60,所以會執行 else 區塊,輸出「不及格」。這樣的結構讓程式可以在兩個分支中選擇一個執行,永遠只會走其中一條路。
if...elif...else:多選一
現實中的判斷往往不只有兩種結果,例如成績的等第、天氣的分類等。這時候就可以用 elif(也就是 else if 的縮寫)來串接多個條件。Python 會由上到下依序檢查,只要某一個條件成立,就只執行該區塊並跳過後續判斷。
score = 85
if score >= 90:
print("A 等")
elif score >= 80:
print("B 等")
elif score >= 70:
print("C 等")
elif score >= 60:
print("D 等")
else:
print("F 等")
執行程式會輸出「B 等」,因為 score 是 85,符合 score >= 80 這個條件。一旦命中,下方的 elif 與 else 都不會再被檢查,這種「短路」特性可以讓程式更有效率。
巢狀條件判斷
有時候一個條件成立後,內部還需要再做一次判斷,這時候就可以把 if 放在另一個 if 裡,形成巢狀結構。巢狀條件可以處理更複雜的邏輯,但也會讓縮排層數變深,因此要適度使用,避免可讀性下降。
age = 20
has_ticket = True
if age >= 18:
if has_ticket:
print("可以入場")
else:
print("已成年但沒帶票")
else:
print("未成年,禁止入場")
當外層的 if 成立時,才會進入內層的判斷;若外層條件不成立,內層的程式碼根本不會被看到。這個例子展示了巢狀條件的典型應用:先檢查大條件,再針對通過的子集合做更細的分類。
不過要特別注意的是,當巢狀層數超過三層時,可讀性通常會快速下降。如果遇到這種情況,可以考慮把內層的條件抽成一個獨立的判斷,或使用邏輯運算子把條件合併。例如上面的入場判斷,也可以改寫成「扁平」版本:
if age >= 18 and has_ticket:
print("可以入場")
elif age >= 18:
print("已成年但沒帶票")
else:
print("未成年,禁止入場")
兩種寫法執行結果相同,但後者少了一層縮排,讀起來更舒服。實務上,盡量讓條件判斷保持「扁平」,是寫出易讀程式碼的好習慣。
三元運算式
當條件判斷的結果只是為了決定某個變數或某段運算式的值時,可以使用三元運算式(ternary expression),把 if...else 寫成一行,讓程式碼更精簡。它的語法是「值 if 條件 else 其他值」,讀起來就像在說:「如果是這樣就用這個值,否則用另一個。」
age = 16
status = "成年" if age >= 18 else "未成年"
print(status) # 輸出 未成年
# 也可以直接用在 print 裡
score = 75
print("及格" if score >= 60 else "不及格") # 輸出 及格
三元運算式適合用在簡單的二選一情境,例如根據條件決定顯示的文字、計算折扣、或設定預設值。當邏輯變得複雜時(例如有巢狀判斷或多個條件),仍建議改用完整的 if...else 結構,避免把一行擠得太長。
綜合練習:成績等第小程式
把今天學到的語法整合起來,我們寫一個完整的成績等第判斷程式。這個範例會同時用到 if、elif、else,以及 input() 函式讓使用者輸入分數,是一個很典型的條件判斷應用。
score = int(input("請輸入分數(0-100):"))
if score < 0 or score > 100:
print("分數超出範圍")
elif score >= 90:
print("A 等:表現優異")
elif score >= 80:
print("B 等:表現良好")
elif score >= 70:
print("C 等:表現中等")
elif score >= 60:
print("D 等:剛好及格")
else:
print("F 等:需要再加強")
執行後,輸入 85 會得到「B 等:表現良好」;輸入 110 則會得到「分數超出範圍」。這個小程式雖然簡短,但已經具備了真實世界常用的「輸入、判斷、輸出」流程。實際應用時,你還可以把它包進迴圈或函式,讓程式能反覆詢問或重複使用,這也是後續章節會介紹的內容。
常見錯誤與除錯建議
寫條件判斷時,有幾個常見的錯誤值得特別留意。熟悉這些坑點,能幫助你在除錯時更快找到問題所在。
忘記冒號或縮排錯誤:if、elif、else 結尾一定要加冒號 :,並且內部的程式碼必須縮排一致。混用 Tab 與空格是新手最常踩的雷,Python 官方建議一律使用 4 個半形空格。
把 = 寫成 ==:在條件裡,= 是賦值運算子,== 才是比較運算子。寫成 if score = 60: 會直接報錯;如果不小心在兩個等號之間多打或少打,都會讓邏輯完全錯誤。
條件順序錯誤:在 if...elif...else 中,順序非常重要,因為一旦命中就不會往下看。舉例來說,如果把 score >= 60 寫在 score >= 90 前面,所有 90 分以上的人都只會被判為「及格」。
# 錯誤示範:順序顛倒導致判斷失準
score = 95
if score >= 60:
print("及格") # 永遠先命中這裡
elif score >= 90:
print("A 等") # 永遠不會執行
布林值與整數混用:Python 中 0、空字串 ""、空串列 [] 會被視為 False,其他非空值則視為 True。這個特性在判斷容器是否為空時很方便,但若沒有意識到,可能會寫出難以理解的程式碼。
items = []
if items:
print("有資料")
else:
print("沒有資料") # 因為空串列是 False,會執行這裡
寫條件判斷時,多花幾秒思考「邊界情況」是否符合預期,是避免 bug 的好方法。
條件判斷與現實世界的對應
條件判斷之所以重要,是因為它讓程式能模擬真實世界的決策邏輯。從自動判斷使用者是否符合資格、決定是否發送通知,到串流平台依觀看紀錄推薦內容,本質上都是一連串條件判斷的組合。理解這個觀念後,未來學習更複雜的決策樹或機器學習分類器時,會發現它們其實都是條件判斷的延伸。
結語
今天我們學會了 Python 的條件判斷語法:最基本的 if、二選一的 if...else、多選一的 if...elif...else、處理複雜邏輯的巢狀條件,以及把簡單判斷寫成一行的三元運算式。透過「成績等第」的綜合練習,你也看到了條件判斷如何應用在真實的小程式中。
明天,我們會進入迴圈的世界。當程式需要重複執行某段程式碼時,for 與 while 將會是非常強大的工具,也是把條件判斷的力量延伸到大量資料上的關鍵。
留言
張貼留言