標籤:map python filter reduce
一.map函數,對任何可迭代序列中的每一個元素應用對應的函數。(不管處理的是什麼類型的序列,最後返回的都是列表。)
作用已經在標題中介紹過了,那麼先來說說map函數的用法吧。
map(處理邏輯可以是函數也可以是lambda運算式,可迭代的序列)
現在有一個列表。
l1 = [1,2,3,4,5]
現在需要給這個列表裡的每一個元素都+1。(當然,使用for迴圈可以做到對序列中的每個元素進行處理,但使用map函數會更加方便。)
首先,定義一個邏輯函數,要如何對序列中的每一個元素進行處理。
def plus(x):
return x + 1
#每個元素都+1
print map(plus,l1)
#將map函數應用到l1的每一個元素中。
輸出的結果為。
>>>[2, 3, 4, 5, 6]
當然,傳入map函數中的邏輯函數還可以使用lambda運算式來表示,還拿剛才的例子示範。
l1 = [1,2,3,4,5]
print map(lambda x:x+1,l1)
>>>[2, 3, 4, 5, 6]
那麼map函數是怎麼做到的?內部功能是如何?的?下面就來對map函數的內部進行剖析。
下面這個函數就可以實現和python內建的map函數一模一樣的功能。
def map_func(func,seq):
map_list = []
for i in seq:
map_list.append(func(i))
return map_list
注意!上面說的map函數的使用方法是針對python2.7版本的,針對python3以上的版本不適用,因為從python3開始,map函數不再返回列表,返回的則是一個迭代器,如果想變成列表的話,還需要使用list() 函數做一個轉換。
二.filter函數,對序列中的元素進行判斷篩選。(返回的結果依舊是個列表。)
fileter函數在拿到一個序列的時候,會開始迴圈迭代這個序列中的每一個元素,對每一個元素都進行一次if判斷,結果為True的加入到列表中,為False的,直接丟掉。
下面是filter函數的簡單用法。
一個列表,將這個列表中小於5的元素,全部都列出來。(當然...這麼簡單的需求也可以使用for迴圈實現)
filter函數用法和map函數一樣都是 filter(函數,可迭代序列)
l1 = [1,2,3,4,5,6,7,8,9,10]
def greater_than(x):
if x < 5:
return True
else:
return False
print filter(greater_than,l1)
>>>[1, 2, 3, 4]
filter函數依舊可以使用lambda運算式來代替邏輯函數。
print filter(lambda x:x<5,l1)
下面來剖析一下filter函數的工作原理,自己手動寫一個和filter功能一模一樣的函數:
def filter_func(func,seq):
filter_list = []
for s in seq:
if func(s):
filter_list.append(s)
return filter_list
注意啦!這裡面的filter函數和map函數一樣,用法都是針對python2.7的,在python3中對這個函數做了一些改動,返回的不再是個列表,而是個迭代器。
三.reduce函數,將序列中所有的元素進行合并運算。
現在有個列表,現在需要每個元素要逐個相乘。
l1 = [1,2,3,4,5,6,7,8,9,10]
#reduce函數規定了,一定要傳遞一個支援一個二元操作的函數
#下面就是定義好的邏輯函數
def bin_func(x,y):
return x * y
print reduce(plus,l1)
>>> 3628800
是reduce函數的工作原理:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8E/D9/wKioL1jNAN2A82opAAC63NnUCNs013.png" title="reduce.png" alt="wKioL1jNAN2A82opAAC63NnUCNs013.png" />
接下來,解剖下reduce函數的實現代碼。
def reduce_func(func,seq,init_num=None):
if init_num != None:
ret = init_num
else:
ret = seq.pop(0)
for i in seq:
ret=func(ret,i) #如果這條邏輯不好理解的話,可以仔細想想1*2*3*4 = ((1*2)*3)*4
return ret
print reduce_func(bin_func,l1)
>>>3628800
reduce函數使用lambda運算式。
print reduce_func(lambda x,y:x*y,l1)
注意!在python3當中,這個reduce函數被放到了functools這個模組中了,需要倒入functools才可以使用這個函數。
最後總結一下:
map函數用於處理序列中每一個元素。
filter函數用於過濾序列中每一個元素。
reduce函數用於做序列的合併作業。
reduce即為化簡,它是這樣一個過程:每次迭代,將上一次的迭代結果(第一次時為init的元素,如沒有init則為seq的第一個元素)與下一個元素一同執行一個二元的func函數。在reduce函數中,init是可選的,如果使用,則作為第一次迭代的第一個元素使用。
本文出自 “reBiRTH” 部落格,請務必保留此出處http://suhaozhi.blog.51cto.com/7272298/1907951
3.python中map,filter,reduce以及內部實現原理剖析