你可能已經學會寫函式,知道什麼是 def、參數、return…… 但今天我們來學「更短、更快、更靈活」的一種寫法:lambda 函式。 它很適合快速幫你做排序、過濾、計算——尤其搭配 sorted()
,效果驚人。
▶️ 1. 開場:lambda 能幹嘛?
先看一個生活應用的例子:
🛍️ 想像你正在整理零食櫃,裡面有各種不同的點心和它們的熱量。 你想把它們從「熱量最低」排到「最高」,但每項目標是由名稱和數字組成的子清單。
這時候,sorted()
就可以搭配 lambda
幫你用「每項的第 2 個數字(熱量)」來排序。snacks = [["洋芋片", 500], ["蘋果", 100], ["巧克力", 450]]
sorted_snacks = sorted(snacks, key=lambda x: x[1])
print(sorted_snacks)
🔽 輸出:
[['蘋果', 100], ['巧克力', 450], ['洋芋片', 500]]
▶️ 2. 什麼是 lambda?
lambda 是 Python 中的 匿名函式,不用 def
寫函式名字,一行定義、一行用完。
⚠️ 注意:lambda 只能寫單一運算式(expression),不能寫多行語句(statements)。 這表示你無法在 lambda 裡執行多步操作,例如賦值、條件、迴圈等。
👉 所以若你需要做比較複雜或多行邏輯的事情,還是得用 def
來寫傳統函式。
語法結構:
lambda 參數: 運算式
與 def 對照:

基本用法:
square = lambda x: x ** 2
print(square(5))
🔽 輸出:
25
▶️ 3. lambda vs def 差異
讓我們用同一個功能來比較 lambda 和 def:這裡的功能是「把兩個數字相加」。
✅ 用 def 定義傳統函式:
def add(x, y):
return x + y
print(add(3, 4))
🔽 輸出:
7
這種寫法適合邏輯較複雜、會重複使用的功能。你可以加入註解、條件判斷、甚至例外處理。
✅ 用 lambda 寫匿名函式:
add_lambda = lambda x, y: x + y
print(add_lambda(3, 4))
🔽 輸出:
7
lambda 適合一次性、簡短的任務,像是搭配 sorted()
做排序依據,或作為 callback 傳給函式。
📌比較:

▶️ 4. lambda + sorted() 排序實戰
✅ 先解釋 sorted() 的運作方式:
sorted() 的語法是:
sorted(iterable, key=函式)
sorted()
是 Python 內建的排序函式。- 把 iterable(這裡是
grades
,也就是一堆成績列表)逐筆丟給key
函式處理 - 根據 key 函式回傳的值進行排序,如果沒有指定
key
,它就直接用元素本身來比較(例如數字大小、字串順序)。 - 但回傳的結果仍是原來的元素(它會回傳一個「排序後的新清單」,不會變成 key 的值)
📌sorted()範例1:元素是數字,會自動以數值大小排序。
g = [2, 1, 3]
print(sorted(g))
🔽 輸出:
[1, 2, 3]
📌sorted()範例2:排序二維 list
grades = [[12, 23, 43], [9, 4, 10], [100, 22, 1]]
sortedGrade = sorted(grades)
print(sortedGrade)
🔽 輸出:
[[9, 4, 10], [12, 23, 43], [100, 22, 1]]
✅lambda + sorted()應用:用 lambda 指定排序 key值
📌範例1:指定依最後一科成績(x[-1])排序
grades = [[12, 23, 43], [9, 4, 10], [100, 22, 1]]
sortedGrade = sorted(grades, key=lambda x: x[-1])
print(sortedGrade)
🔽 輸出:
[[100, 22, 1], [9, 4, 10], [12, 23, 43]]
📌範例2:依加權平均分數排序(搭配 key 函式)
w = lambda x: x[0]*0.3 + x[1]*0.4 + x[2]*0.4
grades = [[12, 23, 43], [9, 4, 10], [100, 22, 1]]
sortedGrade = sorted(grades, key=w)
print(sortedGrade)
🔽 輸出(依加權後排序):
[[9, 4, 10], [100, 22, 1], [12, 23, 43]]
🔍 解釋lambda + sorted()的運作方式:
w([12, 23, 43])
➜ 26.8w([9, 4, 10])
➜ 8.2w([100, 22, 1])
➜ 42.4sorted(grades, key=函式)
是根據 key 函式回傳的這三個分數值來「決定排序順序」,- 但排序結果仍會回傳原始資料本身,而不是 key 的值。
✅ 你得到的仍是原本的三筆成績資料,但順序已經根據加權分數調整過了。(文末補充資料)
▶️ 5. lambda 不是唯一選擇
📌用 def 寫排序依據
def get_last(x):
return x[-1]
grades = [[12, 23, 43], [9, 4, 10], [100, 22, 1]]
print(sorted(grades, key=get_last))
🔽 輸出:
[[100, 22, 1], [9, 4, 10], [12, 23, 43]]
📌用 itemgetter 快速取特定欄
from operator import itemgetter
grades = [[12, 23, 43], [9, 4, 10], [100, 22, 1]]
print(sorted(grades, key=itemgetter(1)))
🔽 輸出:
[[9, 4, 10], [100, 22, 1], [12, 23, 43]]
📌用其他內建函式:
【補充說明】
key=str.lower
的意思是:排序時先把每個字串轉為小寫再比較,這樣可以忽略大小寫差異。- 如果沒加這個 key,'Banana' 會排在 'apple' 前面,因為大寫字母在 ASCII 中排序比較小。
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
🔽 輸出:
['apple', 'Banana', 'Cherry']
▶️ 6. 小練習:
請將下列成績資料依第二科分數「由高到低」排序:
grades = [[70, 85, 90], [88, 76, 92], [95, 90, 80]]
sorted_grades = sorted(grades, key=lambda x: x[1], reverse=True)
print(sorted_grades)
🔽 輸出:
[[95, 90, 80], [70, 85, 90], [88, 76, 92]]
▶️ 7. 小結

🧭 結語
lambda 適合「短、快、亮」的小功能,但邏輯複雜還是建議用 def 寫清楚。用lambda整理程式碼中的清單與資料,能讓資料更加簡潔。
下一集,我們將從畫面轉向磁碟——來看看 Python 怎麼幫我們「存資料」「讀檔案」。 準備好進入《第 7 集:檔案處理與輸入輸出》了嗎?📂📥
🤔補充資料: 如果我想直接得到「加權後的分數清單」怎麼做?
那就要用 list comprehension 來處理,例如:
scores = [w(g) for g in grades]
print(scores)
🔽 輸出:這邊就是加權後的資料囉
[26.8, 8.2, 42.4]