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 等等