map
先看官方介紹:
map(function, iterable, ...)
Return an iterator that applies function to every item of iterable, yielding the results.
map函數至少使用2個參數:(函數,可迭代對象),返回的結果是個迭代器。實現的作用是將前面的函數依次在後面的可迭代對象上執行。
>>> def ljds(x):
... return x+x
...
>>> a=[0,1,2,3,4,5,6,7,8,9]
>>> b=map(ljds,a)
>>> next(b)
0
>>> next(b)
2
>>> next(b)
4
>>> list(b)
[6, 8, 10, 12, 14, 16, 18]
>>>
代碼介紹:函數ljds,參數x,作用是返回一個x加上自己的值。ljds(2)結果是4,ljds('梁家大叔')結果是'梁家大叔梁家大叔'。很基礎,解釋的有點多餘....
a是個列表(可迭代對象)。當執行了3次next(b)後,(b是迭代器)此時的結果只有後面7個元素了,因此list(b)只輸出了3-9的ljds(x)。
map還可以接受更多的參數,但第一位的函數只有一個,後面可以繼續跟可迭代對象:
>>> def ljds(x,y):
... return (x+x,y+y)
...
>>> a=[1,2,3,4,5]
>>> b=[11,22,33,44,55]
>>> c=map(ljds,a,b)
>>> list(c)
[(2, 22), (4, 44), (6, 66), (8, 88), (10, 110)]
>>>
這個就沒必要解釋了。
reduce
官方介紹:
functools.reduce(function, iterable[, initializer])
Apply function of two arguments cumulatively to the items of sequence, from left to right, so as to reduce the sequence to a single value.
值得一提的是reduce在python2中可以直接使用,在python3中已經放在了fucntools模塊裡,用之前要先導入。
reduce調用的函數需要兩個參數,依次使用可迭代對象的元素作為這個函數的參數,函數執行的結果和下一個元素再作為參數執行函數,依此類推。如果第一次執行時設置了initial,則是initial和第一個元素作為第一次執行的參數。可能容易暈,直接看代碼演示吧。
以前學過一篇課文是講數學家高斯的,他小時候做數學題,1+2+3……一直加到100,結果是多少,這題用reduce操作應該是這樣的:
>>> from functools import reduce
>>> def ljds(x,y):
... return x+y
...
>>> a=[x for x in range(101)]
>>> reduce(ljds,a)
5050
>>>
代碼解釋:
導入reduce,創建一個函數ljds,需要2個參數x,y,返回x+y的結果。
a列表是數字從0到100,那麼reduce執行的結果就是:
第一次:因沒設置initial,所以ljds的參數就是列表a的最前面的2個元素,即0和1,相加結果是1。
第二次:第一次的結果1作為參數,第3個元素2也作為參數,即ljds(1,2),結果是3.
第三次:ljds(3,3)
……
一直到結束。
閱讀更多 樑家大叔 的文章