「python」高階函數map、reduce的介紹

「python」高階函數map、reduce的介紹

Python

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)

……

一直到結束。


分享到:


相關文章: