python中函數式編程map、reduce、filter的用法

python中函數式編程map、reduce、filter的用法

  • reduce函數
  • map函數
  • filter函數
  • lambda函數

綜合函數式編程代碼塊

代碼塊語法遵循標準pyhton代碼,例如:

from functools import reduce
from random import randint
number = []
for i in range(9):
     number.append(randint(-99,99))
print('number = ',number)
print('number filter = ',list(filter(lambda x : x>0,number)))
print('averger = ',reduce(lambda x,y : x+y,filter(lambda x : x>0,number))/len(list(filter(lambda x: x>0, number))))
>>> message = '''interpreter
... prompt'''

【reduce函數】

官方解釋:將一個可迭代的對象應用到一個帶有兩個參數的方法上,我們稱之爲appFun,遍歷這個可迭代對象,將其中的元素依次作爲appFun的參數,但這個函數有兩個參數,作爲哪個參數呢?有這樣的規則,看一下下面reduce方法的實現,有三個參數,第一個參數就是上面說的appFun,第二個參數就是那個可迭代的對象,而第三個呢?當調用reduce方法的時候給出了initializer這個參數,那麼第一次調用appFun的時候這個參數值就作爲第一個參數,而可迭代對象的元素依次作爲appFun的第二個參數;如果調用reduce的時候沒有給出initializer這個參數,那麼第一次調用appFun的時候,可迭代對象的第一個元素就作爲appFun的第一個元素,而可迭代器的從第二個元素到最後依次作爲appFun的第二個參數,除第一次調用之外,appFun的第一個參數就是appFun的返回值了。例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),計算1到5的和,因爲沒有給定initializer參數,所以第一次調用x+y時,x=1,即列表的第一個元素,y=2,即列表的第二個元素,之後返回的1+2的結果作爲第二次調用x+y中的x,即上一次的結果,y=2,即第二個元素,依次類推,知道得到1+2+3+4+5的結果
reduce函數在python3.x中已經移除了全局名稱,放入了functools中,需要導入時:from functools import reduce,reduce和map的區別在於,reduce函數每次是對兩個數據進行處理,而map函數是每次只對一個數據進行處理。

【map函數】

map(a,b)a函數可循環遍歷b中的元素
map+lambda

aquares = map(lambda x : x*x,range(9))  
print(list(aquares))

【lambda表達式】

lambda A:B 類似的 y(A)=B

lambda x : x*x ,range(9)

filter函數

過濾器
下面代碼爲計算大於0的數的平均數,涉及到了較全面的函數式編程思想,其中省略了很多中間過程,因爲在python3中,函數返回的爲一個filter型的過濾器,所以沒有辦法輸出,需要通過list函數轉換,但如果單獨傳入參數轉換時會報錯。

以下代碼可行

#如下代碼在python3中無法執行
from functools import reduce
number = [1,2,3,4,6,-9,-8,-7,-10,-11,9]
num1 = filter(lambda x : x>0,number)
print(list(num1))
average = reduce(lambda x,y : x+y,num1)/len(list(num1))

#以下代碼可行
from functools import reduce
from random import randint
number = []
for i in range(9):
     number.append(randint(-99,99))
print('number = ',number)
print('number filter = ',list(filter(lambda x : x>0,number)))
print('averger = ',reduce(lambda x,y : x+y,filter(lambda x : x>0,number))/len(list(filter(lambda x: x>0, number))))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章