Python基礎(二)高階函式map、reduce、filter
阿新 • • 發佈:2018-12-15
高階函式:
- 函式的傳入引數是一個函式名
- 函式的返回值是一個函式名
- 滿足上述條件任意一個即為高階函式
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
是一個Iterator
,Iterato
r是惰性序列,因此通過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
。