1. 程式人生 > >python中的map()函式和reduce()函式的區別和用法介紹

python中的map()函式和reduce()函式的區別和用法介紹

咱們先從定義上來解釋一下這兩個函式的區別: ①從引數方面來講: map(func, *iterables)包含兩個引數,第一個是引數是一個函式,第二個是序列(列表或元組)。其中,函式(即map的第一個引數位置的函式)可以接收一個或多個引數。 reduce(function, sequence[, initial]) 第一個引數是函式,第二個是 序列(列表或元組)。但是,其函式必須接收兩個引數。 ②從對傳進去的數值作用來講: map()是將傳入的函式依次作用到序列的每個元素,每個元素都是獨自被函式“作用”一次;(請下面會有例子說明) reduce()是將傳入的函式作用在序列的第一個元素得到結果後,把這個結果繼續與下一個元素作用(累積計算)

map的程式碼解析:

sys = map(lambda x : x+1, range(1,7) )
print(list(sys)) 

列印結果:

[2, 3, 4, 5, 6, 7]

分析: map()中的匿名函式(lambda x:x+1)接收了一個引數,引數x是在可迭代物件序列(range(1,7))中取值,並返回每個資料+1的結果; 如果輸出語句使用 print(sys),那麼輸出的結果是

<map object at 0x00000219FFD2B6D8>

是一個物件,然後我們再來看一下map的原始碼(如下圖片): 實際上,map()是一個類,而且是擁有__iter__和__next__方法的一個類,也就是說,map()實際上是一個 迭代器

,所以其返回結果是一個可迭代物件。 所以在列印的時候,需要通過next()方法獲取其中的值,這裡,使用list或者for in 遍歷,結果會來得便利一些 在這裡插入圖片描述

reduce程式碼解析:

from functools import reduce
sys = reduce(lambda x, y : x+y, range(1,7))
print(sys)

列印結果:

21

關於reduce函式的原始碼: 在這裡插入圖片描述

關於原始碼中的註釋解釋如下:

將兩個引數的函式累加應用於序列的專案, 從左到右,以便將序列減少到單個值。 例如,reduce(lambda x,y:x + y,[1,2,3,4,5])計算 ((((1 + 2)3)4)5)。 如果存在initial,則將其放在專案之前 計算中的序列,並作為預設值 序列是空的。

也就是說,前一次的運算結果會作為下一次運算中的某一個引數; 下面是debug除錯的過程:

第一次 x = {int} 1 y = {int} 2 第二次 x = {int} 3 y = {int} 3 第三次 x = {int} 6 y = {int} 4 第四次 x = {int} 10 y = {int} 5 第五次 x = {int} 15 y = {int} 6 sys = 21

需要注意的是,reduce函式在使用之前,需要通過functools匯入一下才可以使用