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
| 比較 | def | lambda |
|---|---|---|
| 名稱 | 必須有 | 不用(匿名) |
| 內容 | 多行皆可 | 只能一個運算式 |
| 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 參數: 運算式;用途九成在 sorted、max、min 的 key 參數——「依什麼排序/比較」一行講清楚。該取名的函式還是用 def。下一篇進入模組與套件,學會組織越來越多的程式碼。