python之map、filter、reduce、lambda函數


map

map函數根據提供的函數對指定的序列做映射,定義:
map(function, sequence[,sequence,...])--->list

例1

>>> map(lambda x:x+2, [1, 2, 3])
[3, 4, 5]
>>> map(lambda x:x+2, (1, 2, 3))
[3, 4, 5]
>>> map(lambda x:x+2, [1, 2], [1, 2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 1 argument (2 given)

最后這個例子說lambda函數需要傳2個參數(因為后面的列表是2個)

例2

>>> map(lambda x,y:x+y, [1, 2], [1, 2])
[2, 4]
>>> map(lambda x,y:x+y, [1, 2], (1,2))
[2, 4]

例3

>>> a
[{'type': 2, 'ID': 1}, {'type': 4, 'ID': 2}, {'ID': 3}]
>>> map(lambda x:x['ID'], a)
[1, 2, 3]
>>> map(lambda x:x['type'], a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
KeyError: 'type'

例子說明,如果其中的一個鍵不存在({'ID':3}不存在type)會報錯。

例4

上面例子中只給了lambda,還可以用普通的函數

>>> def func2(x, y):
...     return x+y
... 
>>> map(func2, [1, 2, 3], [3, 2, 1])
[4, 4, 4]
>>> 
>>> def func1(x):
...     return x**2
... 
>>> map(func1, [1, 2, 3])
[1, 4, 9]

例5

如果沒有給定,就類似於zip函數了

>>> map(None, [1, 2, 3, 4], [1, 2, 3, 4])
[(1, 1), (2, 2), (3, 3), (4, 4)]
>>> map(None, [1, 2, 3, 4], [1, 2, 3, 4,5])
[(1, 1), (2, 2), (3, 3), (4, 4), (None, 5)]
>>> map(None, [1, 2, 3, 4], [1, 2, 3, 4,5], [1, 2, 3])
[(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, None), (None, 5, None)]

不過與zip不同

>>> zip([1, 2, 3, 4], [1, 2, 3, 4,5], [1, 2, 3])
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

filter

filter函數對指定的序列進行過濾操作。定義:

filter(function or None, sequence) -> list, tuple, or string

例1

>>> filter(lambda x:x%2==1, [1, 2, 3])
[1, 3]
>>> filter(lambda x:x%2==1, (1, 2, 3))
(1, 3)

reduce

reduce函數會對參數序列中元素進行累積。定義:
reduce(function, sequence[, initial]) -> value

:function必須是有2個參數的函數

例1

>>> reduce(lambda x, y:x+y, [1,2,3,4])
10
>>> reduce(lambda x, y:x+y, [1,2,3,4], 10)
20

如果沒有initial參數,這么算:(((1+2)+3)+4)

如果有initial參數,這么算: ((((10+1)+2)+3)+4)

lambda

編程中提到的 lambda 表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數

舉例對比(列表中的元素平方):

>>> map(lambda x:x*x, range(5))
[0, 1, 4, 9, 16]

>>> def sq(x):
...     return x * x
... 
>>> map(sq, range(5))
[0, 1, 4, 9, 16]
前者比后者好。因為后者多定義了一個(污染環境的)函數,尤其如果這個函數只會使用一次的話。而且第一種寫法實際上更易讀,因為那個映射到列表上的函數具體是要做什么,非常一目了然。如果你仔細觀察自己的代碼,會發現這種場景其實很常見:你在某處就真的只需要一個能做一件事情的函數而已,連它叫什么名字都無關緊要。Lambda 表達式就可以用來做這件事。

map(lambda x:x*x, range(5))
這樣的寫法時,你會發現自己如果能將「遍歷列表,給遇到的每個元素都做某種 運算」的過程從一個循環里抽象出來成為一個函數 map,然后用 lambda 表達式將這種 運算作為參數傳給 map 的話,考慮事情的思維層級會高出一些來,需要顧及的細節也少了一點。Python 之中,類似能用到 lambda 表達式的「高級」函數還有 reduce、filter 等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM