python裏map,reduce,filter函數

map()

映射,內置函數map()可以將一個函數依次映射到序列或迭代器對象的每個元素上,並返回一個可迭代的map對象作爲結果,map對象中每個元素是原序列中元素經過該函數處理後的結果,該函數不對原序列或迭代器對象做任何修改。

要注意,我們調用完map之後得到的結果不是一個list而是一個迭代器,我們想要獲得完整的內容需要將它轉化成list類型。

1、語法:
map(function, iterable, …)
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。

2、案例:
2.1、提供了兩個列表,對相同位置的列表數據進行相加

>>> result = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
>>> print(list(result))
[3, 7, 11, 15, 19]

2.2、單參數函數

>>> def add5(x):
        return x+5
>>> list(map(add5, range(10)))  #把單參數函數映射到一個序列的所有元素
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

2.3、接收2個參數的函數

>>> def add(x, y):
        return x+y
>>> list(map(add, range(5), range(5,10)))  #把雙參數函數映射到兩個序列上
[5, 7, 9, 11, 13]

>>> list(map(lambda x, y: x+y, range(5), range(5,10)))
[5, 7, 9, 11, 13]

3、應用場景:
1-10,對每個數字求平方

>>> result = map(lambda x:x**2,range(1,11))
>>> for n in result:
        print(n)

reduce()

標準庫functools中的函數reduce()可以將一個接收2個參數的函數以迭代累積的方式從左到右依次作用到一個序列或迭代器對象的所有元素上,並且允許指定一個初始值。
例如,

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

計算過程爲((((1+2)+3)+4)+5),第一次計算時x爲1而y爲2,再次計算時x的值爲(1+2)而y的值爲3,再次計算時x的值爲((1+2)+3)而y的值爲4,以此類推,最終完成計算並返回((((1+2)+3)+4)+5)的值。

和map不同的是,reduce最後得到一個結果,而不是一個迭代器或者是list。

1、語法:
reduce(function, iterable[, initializer])
函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最後得到一個結果。

python3中將 reduce 放在functools模塊中了

2、案例:
2.1、提供了兩個列表,對相同位置的列表數據進行相加

from functools import reduce
>>> result = reduce(lambda x, y: x+y, [1,2,3,4,5])
>>> print(result)
15

2.2、兩種方式對比

from functools import reduce
>>> def add(x, y):
        return x+y
>>> seq = list(range(1, 10))
>>> reduce(add, seq)
45

>>> reduce(lambda x, y: x+y, seq)  #使用lambda表達式實現相同功能
45

3、應用場景:
計算1-100的和

from functools import reduce
>>> result = reduce(lambda x, y: x + y, range(1, 101))
>>> print(result)

filter()

filter的英文是過濾,它的用法和map有些類似,通過編寫一個函數來判斷元素是否合法。通過調用filter,會自動將這個函數應用到容器當中所有的元素上,最後只會保留運行結果是True的元素,而過濾掉那些是False的元素。

1、語法:

filter(function, iterable)
該接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判,然後返回True 或 False,最後將返回 True 的元素放到新列表中。

2、案例
得到列表中的奇數

#可以
>>> def is_odd(n):
        return n % 2 == 1
>>> newlist = filter(is_odd, [1, 3, 2, 4, 5, 8])
>>> for n in newlist:
        print(n)
1
3
5

#還可以
>>> arr = [1, 3, 2, 4, 5, 8]
>>> [i for i in arr if i % 2 > 0 ]
[1, 3, 5]

#最後可以使用filter  更方便
>>> list(filter(lambda x: x % 2 > 0, arr))

3、應用場景:
{“a”,”ab”,”abc”,”bc”,”cd”}輸出含有C字符的元素

>>> result = filter(lambda x: "c" in x, {"a", "ab", "abc", "bc", "cd"})
>>> for n in result:
        print(n)
bc
abc
cd
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章