1. 程式人生 > >Python3.4中filter函式,map函式和reduce函式

Python3.4中filter函式,map函式和reduce函式

filter函式:
filter()為已知的序列的每個元素呼叫給定的布林函式,呼叫中,返回值為非零的元素將被新增至一個列表中

>>> def f1(x):
if x > 20:
return True
else:
return False

>>> l1 = [ 1, 2, 3, 42, 67, 16 ]
>>> filter( f1, l1)
<filter object at 0x01F594F0>
>>> l2 = filter( f1, l1 )
>>> print(l2)
<filter object at 0x01FA30D0>
>>> l2.__next__
<method-wrapper '__next__' of filter object at 0x01FA30D0>
>>> l2.__next__()
42
>>> l2.__next__()
67
>>> l2.__next__()
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    l2.__next__()
StopIteration

map函式:
map()將函式呼叫對映到每個序列的對應元素上並返回一個含有所有返回值的列表
>>> def f1( x, y ):
return (x,y)

>>> l1 = [ 0, 1, 2, 3, 4, 5, 6 ]
>>> l2 = [ 'Sun', 'M', 'T', 'W', 'T', 'F', 'S' ] 
>>> l3 = map( f1, l1, l2 )
>>> print(list(l3))
[(0, 'Sun'), (1, 'M'), (2, 'T'), (3, 'W'), (4, 'T'), (5, 'F'), (6, 'S')]

>>> print( list(map(f2, l1) ))
[0, 2, 4, 6, 8, 10, 12]

>>> print( list(map(f2, l2) ) )
['SunSun', 'MM', 'TT', 'WW', 'TT', 'FF', 'SS']

>>> def f3( x, y ):
return x*2, y*2

>>> print( list(map(f3, l1, l2) ))
[(0, 'SunSun'), (2, 'MM'), (4, 'TT'), (6, 'WW'), (8, 'TT'), (10, 'FF'), (12, 'SS')]

reduce函式:
在Python 3裡,reduce()函式已經被從全域性名字空間裡移除了,它現在被放置在fucntools模組裡 用的話要 先引
入:
>>> from functools import reduce 
>>> print(l1)
[0, 1, 2, 3, 4, 5, 6]
>>> reduce( f4, l1 )
21

三個函式比較類似,都是應用於序列的內建函式。常見的序列包括list、tuple、str。 1.map函式 map函式會根據提供的函式對指定序列做對映。 map函式的定義: map(function, sequence[, sequence, ...]) -> list 通過定義可以看到,這個函式的第一個引數是一個函式,剩下的引數是一個或多個序列,返回值是一個集合。 function可以理解為是一個一對一或多對一函式,map的作用是以引數序列中的每一個元素呼叫function函式,返回包含每次function函式返回值的list。 比如要對一個序列中的每個元素進行平方運算: map(lambda x: x ** 2, [1, 2, 3, 4, 5]) 返回結果為: [1, 4, 9, 16, 25] 在引數存在多個序列時,會依次以每個序列中相同位置的元素做引數呼叫function函式。 比如要對兩個序列中的元素依次求和。 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) map返回的list中第一個元素為,引數序列1的第一個元素加引數序列2中的第一個元素(1 + 2), list中的第二個元素為,引數序列1中的第二個元素加引數序列2中的第二個元素(3 + 4), 依次類推,最後的返回結果為: [3, 7, 11, 15, 19] 要注意function函式的引數數量,要和map中提供的集合數量相匹配。 如果集合長度不相等,會以最小長度對所有集合進行擷取。 當函式為None時,操作和zip相似: map(None, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) 返回結果為: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)] 2.filter函式 filter函式會對指定序列執行過濾操作。 filter函式的定義: filter(function or None, sequence) -> list, tuple, or string function是一個謂詞函式,接受一個引數,返回布林值True或False。 filter函式會對序列引數sequence中的每個元素呼叫function函式,最後返回的結果包含呼叫結果為True的元素。 返回值的型別和引數sequence的型別相同 比如返回序列中的所有偶數: def is_even(x): return x & 1 != 0 filter(is_even, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 返回結果為: [1, 3, 5, 7, 9] 如果function引數為None,返回結果和sequence引數相同。 3.reduce函式 reduce函式,reduce函式會對引數序列中元素進行累積。 reduce函式的定義: reduce(function, sequence[, initial]) -> value function引數是一個有兩個引數的函式,reduce依次從sequence中取一個元素,和上一次呼叫function的結果做引數再次呼叫function。 第一次呼叫function時,如果提供initial引數,會以sequence中的第一個元素和initial作為引數呼叫function,否則會以序列sequence中的前兩個元素做引數呼叫function。 reduce(lambda x, y: x + y, [2, 3, 4, 5, 6], 1) 結果為21(  (((((1+2)+3)+4)+5)+6)  ) reduce(lambda x, y: x + y, [2, 3, 4, 5, 6]) 結果為20

注意function函式不能為None。