Python3版本中的filter函數,map函數和reduce函數


一.filter函數:

  filter()為已知的序列的每個元素調用給定的布爾函數,調用中,返回值為非零的元素將被添加至一個列表中

 1 def f1(x):  
 2     if x>20: 
 3         return True  
 4     else:  
 5         return False  
 6   
 7 l1 = [ 1, 2, 3, 42, 67, 16 ]  
 8 print(filter(f1, l1))  
 9 #輸出如下:
10 #<filter object at 0x000000000117B898>  
11 l2 = filter( f1, l1 )  
12 print(l2)
13 #輸出如下  
14 # <filter object at 0x0000000000BCB898>  
15 print(l2.__next__)
16 #輸出如下  
17 # <method-wrapper '__next__' of filter object at 0x000000000074B898>  
18 print(l2.__next__())  
19 # 42  
20 print(l2.__next__())  
21 # 67  
22 print(l2.__next__())
23 #遍歷結束出現異常  
24 # Traceback (most recent call last):  
25 #   File "<pyshell#14>", line 1, in <module>  
26 #     l2.__next__()  
27 # StopIteration  

二.map函數:

  map()將函數調用映射到每個序列的對應元素上並返回一個含有所有返回值的列表

 1 def f1( x, y ):  
 2     return (x,y)  
 3   
 4 l1 = [ 0, 1, 2, 3, 4, 5, 6 ]  
 5 l2 = [ 'Sun', 'M', 'T', 'W', 'T', 'F', 'S' ]   
 6 l3 = map( f1, l1, l2 )  
 7 print(list(l3))  
 8 #[(0, 'Sun'), (1, 'M'), (2, 'T'), (3, 'W'), (4, 'T'), (5, 'F'), (6, 'S')]  
 9 
10 def f2(x):
11     return(x*2)  
12 print( list(map(f2, l1)))  
13 #[0, 2, 4, 6, 8, 10, 12]  
14   
15 print( list(map(f2, l2)))  
16 # ['SunSun', 'MM', 'TT', 'WW', 'TT', 'FF', 'SS']  
17   
18 def f3( x, y ):  
19     return (x*2, y*2)  
20   
21 print( list(map(f3, l1, l2)))  
22 # [(0, 'SunSun'), (2, 'MM'), (4, 'TT'), (6, 'WW'), (8, 'TT'), (10, 'FF'), (12, 'SS')] 

三.reduce函數:

  在Python 3里,reduce()函數已經被從全局名字空間里移除了,它現在被放置在fucntools模塊里 用的話要 先引 入:

1 from functools import reduce 
2 l1=[0, 1, 2, 3, 4, 5, 6]
3 def f4(x,y):
4     return(x+y)
5 print(reduce( f4, l1 ))
6 #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])   #這個是python2中的方法了,py3中不能傳遞None的類型

    返回結果為:

      [(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的類型相同

  比如返回序列中的所有偶數:

  

1 def is_even(x): 
2     return x%2 == 0 
3 print(list(filter(is_even, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])))
4 # [2, 4, 6, 8, 10]
5 # [Finished in 0.1s]

 

  如果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。

  

1 from functools import reduce
2 print(reduce(lambda x, y: x + y, [2, 3, 4, 5, 6], 1)) 
3 #結果為21( (((((1+2)+3)+4)+5)+6) ) 
4 print(reduce(lambda x, y: x + y, [2, 3, 4, 5, 6])) 
5 #結果為20

  注意function函數不能為None。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM