攝影或3C

Python 實戰:拒絕麵條式代碼!用 Lambda + Next 重構成績評級系統; grade = next(result for condition, result in rules if condition(score))

在 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

痛點分析

  1. 重複代碼多:你看得出來 score >= 出現了多少次嗎?
  2. 修改麻煩:如果要改成「85 分以上才是 A」,你需要深入函數內部修改邏輯。
  3. 視覺干擾:邏輯判斷(if)和業務結果(return ‘A’)混雜在一起。

第二階段:Lambda + Next 的優雅重構

我們換個思維:把「判斷邏輯」跟「等級結果」拆開來,變成一張設定表。

我們會用到兩個技巧:

  1. Lambda:用來封裝判斷條件(例如 lambda s: s >= 90)。
  2. 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

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

Recent Posts