在 Python 開發中,處理「區間判斷」是家常便飯。最經典的例子就是將分數轉換為等級(A, B, C…)。
初學者往往會寫出一長串的 if-elif-else,雖然跑得動,但看起來就像一盤散亂的義大利麵。今天我們用 Lambda 函數 搭配 Next 迭代器,把這段邏輯變成優雅的「規則配置表」。
第一階段:傳統的 If-Elif-Else 寫法
這是我們最熟悉的寫法。假設規則如下:
- 90 分以上:A
- 80 ~ 89 分:B
- 70 ~ 79 分:C
- 60 ~ 69 分:D
- 60 分以下:F
def get_grade_traditional(score):
# 這裡還得先檢查分數是否合法,讓層級變更深
if score < 0 or score > 100:
return "無效分數"
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'F'
# 測試
print(f"95分: {get_grade_traditional(95)}") # A
print(f"82分: {get_grade_traditional(82)}") # B
print(f"59分: {get_grade_traditional(59)}") # F痛點分析
- 重複代碼多:你看得出來
score >=出現了多少次嗎? - 修改麻煩:如果要改成「85 分以上才是 A」,你需要深入函數內部修改邏輯。
- 視覺干擾:邏輯判斷(if)和業務結果(return ‘A’)混雜在一起。
第二階段:Lambda + Next 的優雅重構
我們換個思維:把「判斷邏輯」跟「等級結果」拆開來,變成一張設定表。
我們會用到兩個技巧:
- Lambda:用來封裝判斷條件(例如
lambda s: s >= 90)。 - Next:用來在規則表中「撈」出第一個符合的結果。
完整代碼展示
def get_grade_pro(score):
# 1. 定義規則表 (List of Tuples)
# 格式:(判斷條件函數, 回傳結果)
# 注意:順序很重要,Python 會由上往下檢查
rules = [
(lambda s: not (0 <= s <= 100), "無效分數"), # 先擋無效輸入
(lambda s: s >= 90, 'A'),
(lambda s: s >= 80, 'B'),
(lambda s: s >= 70, 'C'),
(lambda s: s >= 60, 'D'),
(lambda s: True, 'F') # 這是 else,永遠為真
]
# 2. 啟動引擎
# 翻譯:遍歷 rules,把 score 丟進去檢查,回傳第一個檢查為 True 的結果
grade = next(result for condition, result in rules if condition(score))
return grade
# 測試
print("--- 重構後測試 ---")
print(f"105分: {get_grade_pro(105)}") # 無效分數
print(f"95分: {get_grade_pro(95)}") # A
print(f"82分: {get_grade_pro(82)}") # B
print(f"65分: {get_grade_pro(65)}") # D
print(f"30分: {get_grade_pro(30)}") # F
為什麼這樣寫比較好?
1. 邏輯與資料分離
你的 rules 列表其實就是一份「配置檔」。如果老闆明天說:「我們要新增一個 S 級,95 分以上算 S」,你只需要在列表插入一行:
(lambda s: s >= 95, 'S'),完全不需要去動下面的 next(...) 核心邏輯。
2. next() 的高效率
next() 函數非常聰明,它具有短路特性(Short-circuiting)。
假設分數是 95 分:
- 它檢查第一條(無效分數) -> False
- 檢查第二條(>=90) -> True!
- 立刻停止並回傳 ‘A’,後面的 B, C, D 規則完全不會被執行,節省資源。
3. 處理邊界條件更靈活
你可以看到我把 無效分數 的檢查也變成了一條規則,放在最上面。這讓「錯誤處理」也變成了規則的一部分,而不是一層醜陋的嵌套 if。
總結
- 初級寫法:用
if-elif-else硬刻邏輯。 - 進階寫法:用
Lambda定義規則,用Next驅動決策。
這種模式在處理狀態機(State Machine)、權限判斷或是複雜的表單驗證時非常強大。下次遇到一長串的 if-elif,不妨試試看這個「Python 煉金術」!
推薦hahow線上學習python: https://igrape.net/30afN










近期留言