items = [1,2,3,4,5] result = [] for i in items: result.append(i*i)map 提供了另一種方法
def square(x): return x*x result = map(square, items)map 的第一個參數是函式,第二個參數是序列, 而傳回值則是將輸入的函式套用到輸入序列的每一項元素所形成的新序列。 其實還可以寫得更短
result = map(lambda x: x*x, items)上面例子中的 lambda x: x*x 定義了一個無名函式,效果就如同前面定義的 square()。 假設現在問題變成將 list 中的偶數挑出來放到一個新的 list,最直接的做法是
result = [] for i in items: if i % 2 == 0: result.append(i)filter 提供了另一種方法
def is_even(x): return x % 2 == 0 result = filter(is_even, items)假設 item 是 items 中的元素, 如果 is_even(item) 是 true 的話,item 就會被放到新的序列中, 如果是 false 的話,item 就不會被放到新的序列中。 同樣地,上面的例式可以用無名函式改寫
result = filter(lambda x: x % 2 == 0, items)
其實 map 跟 filter 可以辦到的事 list comprehensions 也辦的到,對於 map 的例子可用
reuslt = [i*i for i in items]對於 filter 的例子可用
result = [i for i in items if i % 2 == 0]最後再來一個練習題,如何將 list 中的偶數挑出來平方之後再放到一個新的 list? 答案是結合 map 以及 filter
result = map(square, filter(is_even, items))不過用 list comprehensions 會更易讀且速度也更快
result = [i*i for i in items if i % 2 == 0]原因是將 map() 及 filter() 串起來的時候使用了兩次迴圈, 而 list comprehensions 只用了一次。
有人可能會問 map() 跟 filter() 的命名由來, map 的意思是映射,即把一個集合 (第二個輸入的參數) 經過一個函式 (第一個輸入的參數) 映到一個集合 (輸出); filter 的意思是過濾,即把一個集合 (第二個輸入的參數) 經過一個函式 (第一個輸入的參數) 過濾之後的結果放到一個集合 (輸出)。
那什麼時候該用 map 及 filter 這些 function 呢? Python 創造者 Guido van Rossum 的建議 [1] 是
意思是說如果輸入函式是內建函式的話就用 map 或 filter, 如果不是內建函式就用 list comprehensions。On the other hand, map() and filter() are often useful and when used with a pre-existing function (e.g. a built-in) they are clearer than a list comprehension or generator expression. (Don't use these with a lambda though; then a list comprehension is clearer and faster.)
[1] 語出 Python 3000 FAQ
No comments:
Post a Comment