專項練習 · 7 分鐘閱讀

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])

兩種可讀寫法

你的練習清單

常見問題

為什麼 print(map(...)) 顯示的是物件?

Python 3 中 map 回傳惰性迭代器。用 list() 消費這些值並顯示出來。

map 比列表推導式快嗎?

取決於函式和輸入。簡單轉換的差異通常很小,可讀性更重要。

filter 可以回傳非布林值嗎?

它會按真值/假值判斷,但回傳真正的布林值更清楚,也更不容易出錯。

練習 lambda、map 與 filter

12 道題,覆蓋匿名函式、惰性迭代器、篩選和可讀寫法。

打開練習

繼續閱讀: