python之map、filter、reduce、lambda函數 轉

python之map、filter、reduce、lambda函數

 轉  http://www.cnblogs.com/kaituorensheng/p/5300340.html

map

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

例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個)函數

例2post

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

例3url

複製代碼
>>> 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)會報錯。spa

例4code

上面例子中只給了lambda,還能夠用普通的函數htm

複製代碼
>>> 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]
複製代碼

例5blog

若是沒有給定,就相似於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 等等
相關文章
相關標籤/搜索