Python Lambda、map 與 filter 練習
map 和 filter 是轉換與篩選的短工具。函式足夠簡單,並且記住 Python 3 中它們回傳惰性迭代器時,這兩種工具最好用。
一行規則用 lambda
lambda 是表達式,不是語句。把短函式直接傳給另一個函式時,它很方便。規則需要名字或多行程式碼時,用 def 定義普通函式。
double = lambda n: n * 2
print(double(4))
print((lambda a, b: a + b)(2, 3))兩個小 lambda
map 轉換每個元素
map(function, values) 會把函式應用到每個值。結果是惰性的,所以要用 list() 才能顯示或索引。輸入序列不會被修改。
nums = [1, 2, 3]
print(list(map(lambda n: n + 1, nums)))轉換每個值
filter 保留比對項
filter(predicate, values) 只保留謂詞回傳 True 的值。謂詞應該回傳布林值。列印前先把結果轉成列表。
nums = [1, 2, 3, 4]
print(list(filter(lambda n: n % 2 == 0, nums)))保留偶數值
組合 map 與 filter
從內向外讀這條流水線:先篩選,再轉換剩下的值。如果一行太長,就給中間結果起個名字。
nums = [1, 2, 3, 4, 5]
even = filter(lambda n: n % 2 == 0, nums)
print(list(map(lambda n: n * n, even)))先篩選,再轉換
選擇更易讀的寫法
列表推導式常用更少的符號表達同樣的意思。函式已經存在時,比如 str.upper 或 len,map 和 filter 很合適。優先選擇初學者能一眼讀懂的版本。
names = ["latte", "tea"]
print(list(map(str.upper, names)))
print([name.upper() for name in names])兩種可讀寫法
你的練習清單
- lambda 只用於簡短、明確的規則。
- 檢查 map 和 filter 結果時,用 list() 包起來。
- 從內向外閱讀流水線。
- 推導式更容易掃讀時,優先用推導式。
常見問題
為什麼 print(map(...)) 顯示的是物件?
Python 3 中 map 回傳惰性迭代器。用 list() 消費這些值並顯示出來。
map 比列表推導式快嗎?
取決於函式和輸入。簡單轉換的差異通常很小,可讀性更重要。
filter 可以回傳非布林值嗎?
它會按真值/假值判斷,但回傳真正的布林值更清楚,也更不容易出錯。
練習 lambda、map 與 filter
12 道題,覆蓋匿名函式、惰性迭代器、篩選和可讀寫法。
繼續閱讀: