1. 程式人生 > 其它 >python高階函式:map(f,[list]),reduce(f,[list],可選初始值),

python高階函式:map(f,[list]),reduce(f,[list],可選初始值),

map,reduce和filter三個函式在python3和python2中發生了較大的差異。具體請看文章後面部分。 1. python的map()函式 2. python的reduce()函式 3. python的lambda()函式

lambda函式

python的map()函式 map()函式接收兩個引數,一個是函式,一個是序列,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的list返回。

舉例說明,比如我們有一個函式f(x)=x%2,要把這個函式作用在一個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實現

#使用lambda函式
 print map(lambda x: x % 2, range(7))

[0, 1, 0, 1, 0, 1, 0]

一個最簡單的例子,如基於f(x) = x²,map()作用於list [1, 2, 3, 4, 5, 6, 7, 8, 9]後的結果如下:返回結果仍為list

python的reduce()函式

reduce()函式也是Python內建的一個高階函式。

reduce()函式接收的引數和 map()類似,一個函式 f,一個list,但行為和 map()不同,reduce()傳入的函式 f 必須接收兩個引數,reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。

例如,編寫一個f函式,接收x和y,返回x和y的和:

def f(x, y):
    return x + y

呼叫 reduce(f, [1, 3, 5, 7, 9])時,reduce函式將做如下計算:

1
2
3
4
5

先計算頭兩個元素:f(1, 3),結果為4; 再把結果和第3個元素計算:f(4, 5),結果為9; 再把結果和第4個元素計算:f(9, 7),結果為16; 再把結果和第5個元素計算:f(16, 9),結果為25; 由於沒有更多的元素了,計算結束,返回結果25。

上述計算實際上是對 list 的所有元素求和。雖然Python內建了求和函式sum(),但是,利用reduce()求和也很簡單。

reduce()還可以接收第3個可選引數,作為計算的初始值。如果把初始值設為100,計算:

reduce(f, [1, 3, 5, 7, 9], 100)

結果將變為125

前兩天突然用到了python3的map,reduce函式,按照之前python2的方式使用,結果發現結果並不是自己想要的,查詢了資料之後才發現原來map,reduce和filter三個函式在python3和python2中發生了較大的差異。

首先,在型別上,python3中三者是class,返回結果變成了可迭代的物件,而在python2中,三者是內建函式,即。在python3中,得到map(或者filter,reduce)的結果,可以通過如下迭代方式:

或者直接將結果變為list,如下:

最後需要說明的是reduce函式在python3中已經不屬於build-in了,而是在functools模組下,如需使用,需要從functools模組中引入。

print('在py3中執行map')
temp1=map(lambda arg:arg+100, range(7))
print(temp1)
print('在py3中z正確執行map')
temp2=list(map(lambda arg:arg+100, range(7)))
print(temp2)