1. 程式人生 > >Python基礎(二)高階函式map、reduce、filter

Python基礎(二)高階函式map、reduce、filter

高階函式:

  1. 函式的傳入引數是一個函式名
  2. 函式的返回值是一個函式名
  3. 滿足上述條件任意一個即為高階函式

map:處理序列中的每一個元素,得到的結果是一個列表,該列表元素個數及位置與原來一樣
reduce:處理一個序列,然後把序列進行合併操作
filter:遍歷序列中的每一個元素,判斷每個元素的到布林值,如果是True則留下

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

舉例說明,如果對一個列表[1, 2, 3, 4, 5]中的每一個元素做加1操作,就可以用map()來實現:

>>> l = [1, 2, 3, 4, 5]
>>> res = map(lambda x:x+1,l)
>>> print(list(res))
[2, 3, 4, 5, 6]

map()傳入的第一個引數是lambda匿名函式。由於結果res是一個IteratorIterator是惰性序列,因此通過list()函式讓它把整個序列都計算出來並返回一個list

#在不使用map()的情況下,可以通過如下程式碼實現每個元素加1的操作,相比之下map()僅需一行程式碼就能實現
list1 = [1,2,3,4,5]
def map_test
(func,array):
res = [] for i in array: res.append(func(i)) return res print(map_test(lambda x:x+1,list1))

將列表轉換為字串:

>>> list1 = [1,2,3,4,5]
>>> res = map(str,list1)
>>> print(list(res))
['1', '2', '3', '4', '5']

reduce():
reduce()把一個函式作用在一個序列[x1, x2, x3, ...]

上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下一個元素做累積計算

比方說對一個序列求和,就可以用reduce實現:

>>> from functools import reduce
>>> list3 = [1,2,3,4]
>>> res = reduce(lambda x,y:x+y,list3,)
>>> print(res)
10
>>> res1 = reduce(lambda x,y:x+y,list3,2)
>>> print(res1)
12
>>>

當然求和運算可以直接用Python內建函式sum(),沒必要動用reduce(),但是如果要把序列[1,2,3,4]變換成整數1234,reduce就可以派上用場:

>>> res2 = reduce(lambda x,y:x*10+y,list3)
>>> print(res2)
1234

filter()
map()類似,filter()也接收一個函式和一個序列。和map()不同的是,filter()把傳入的函式依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。

list2 = ['test_1','test_2','3','test4']
res = filter(lambda x:not x.startswith('test'),list2)
print(list(res))

同樣,在一個list中,刪掉偶數,只保留奇數,可以這麼寫:

>>> list4 = [1,2,3,4,5]
>>> res = filter(lambda x:x%2==1,list4)
>>> print(list(res))
[1, 3, 5]
>>>

注意到filter()函式返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函式獲得所有結果並返回list