Python lambda 匿名函式

Python lambda(Python Lambda)

這篇 Python lambda 教學將帶你認識匿名函式:不用取名、一行寫完的迷你函式。lambda 真正的舞台是當「別的函式的參數」——尤其是 sorted()max()min()key,這也是第 18 篇成績管理挑戰題(排名功能)的解答。

lambda 語法

lambda 參數: 運算式

與一般函式的對照:

def add(a, b):
    return a + b

add2 = lambda a, b: a + b    # 等價的 lambda 寫法

print(add(3, 5))
print(add2(3, 5))

執行輸出:

8
8
比較deflambda
名稱必須有不用(匿名)
內容多行皆可只能一個運算式
return要寫不用寫,運算式結果就是回傳值
適用一般情況當場用完即丟的小函式

注意:把 lambda 指派給變數(如上面的 add2)只是示範,實務上該取名就用 def

主戰場:sorted() 的 key 參數

sorted() 預設依元素本身排序,key 參數可以指定「依什麼排序」:

words = ["banana", "fig", "cherry"]

print(sorted(words))                  # 依字母排序
print(sorted(words, key=len))         # 依長度排序
print(sorted(words, key=len, reverse=True))

執行輸出:

['banana', 'cherry', 'fig']
['fig', 'banana', 'cherry']
['banana', 'cherry', 'fig']

(banana 與 cherry 同長度時保留原本的相對順序,這稱為穩定排序。)

key=len 用的是內建函式,需要自訂邏輯時就輪到 lambda。依 Tuple 的第二個元素排序:

scores = [("小明", 85), ("小華", 92), ("小美", 78)]

ranked = sorted(scores, key=lambda item: item[1], reverse=True)
print(ranked)

執行輸出:

[('小華', 92), ('小明', 85), ('小美', 78)]

依字典的值排序

成績管理程式的「排名」就是這樣寫——items() 取出 (key, value) 對,再依 value 排序:

avg_scores = {"小明": 85.0, "小華": 92.0, "小美": 78.0}

ranking = sorted(avg_scores.items(), key=lambda kv: kv[1], reverse=True)

for i, (name, avg) in enumerate(ranking, start=1):
    print(f"第 {i} 名:{name}({avg})")

執行輸出:

第 1 名:小華(92.0)
第 2 名:小明(85.0)
第 3 名:小美(78.0)

max() 與 min() 的 key

products = [
    {"name": "鍵盤", "price": 1200},
    {"name": "滑鼠", "price": 800},
    {"name": "螢幕", "price": 5500},
]

most_expensive = max(products, key=lambda p: p["price"])
print(most_expensive["name"])

執行輸出:

螢幕

常見錯誤

1. 在 lambda 裡寫多個敘述

lambda x: print(x); x + 1 這類寫法行不通——lambda 只能放「一個運算式」。邏輯複雜就改用 def

2. TypeError: ‘<‘ not supported between instances

排序的對象是 dict 或混合型別、又沒給 key(例如直接 sorted(products))。告訴 Python 依什麼排:key=lambda p: p["price"]

3. 把 lambda 當萬靈丹

巢狀 lambda、塞了三元運算式的長 lambda 都很難讀。原則和 Comprehension 一樣:一眼看不懂就改寫成 def

總結

lambda 是一行的匿名函式,lambda 參數: 運算式;用途九成在 sortedmaxminkey 參數——「依什麼排序/比較」一行講清楚。該取名的函式還是用 def。下一篇進入模組與套件,學會組織越來越多的程式碼。

延伸閱讀