函數(shù)式編程就是對(duì)一個(gè)序列應(yīng)用一些函數(shù)工具。在Python中,reduce、map、filter都是函數(shù)式編程工具。
一、lambda表達(dá)式 lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多。 lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。 lambda表達(dá)式是起到一個(gè)函數(shù)速寫(xiě)的作用。允許在代碼內(nèi)嵌入一個(gè)函數(shù)的定義。
例子1:定義了一個(gè)lambda表達(dá)式,求三個(gè)數(shù)的和。 
例子2:用lambda表達(dá)式求n的階乘。 
二、map函數(shù) map函數(shù)應(yīng)用于每一個(gè)可迭代的項(xiàng),返回的是一個(gè)結(jié)果list。如果有其他的可迭代參數(shù)傳進(jìn)來(lái),map函數(shù)則會(huì)把每一個(gè)參數(shù)都以相應(yīng)的處理函數(shù)進(jìn)行迭代處理。map函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是序列,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的list返回。
格式
map(func, seq1[, seq2...] )map可以使用任何的lambda函數(shù)操作,本質(zhì)上是把原有的list根據(jù)lambda法則變成另外一個(gè)list,例子如下:
l = [1,2,3]new_list = list(map(lambda i: i+1, l))PRint(new_list)# Py3里,外面需要套個(gè)list:這是為了讓里面的值給顯示出來(lái),要不然你會(huì)得到這是個(gè)map函數(shù)而不是里面的值。Py2的童鞋不需要# 我們也可以把兩個(gè)數(shù)組搞成一個(gè)單獨(dú)的數(shù)組l2 = [4,5,6]new_list = list(map(lambda x,y: x+y, l, l2))print(new_list)三、reduce函數(shù) reduce函數(shù)也是Python內(nèi)置的一個(gè)高階函數(shù)。在python 3.0.0以后, reduce已經(jīng)不在built-in function里了, 要用它就得在文件開(kāi)頭寫(xiě)入
from functools import reducereduce函數(shù)接收的參數(shù)和map類(lèi)似,一個(gè)函數(shù)f,一個(gè)list,但行為和 map不同:reduce傳入的函數(shù) f ,必須接收兩個(gè)參數(shù),reduce對(duì)list的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。
例如,編寫(xiě)一個(gè)f函數(shù),接收x和y,返回x和y的和:
def f(x, y): return x + y調(diào)用 reduce(f, [1, 3, 5, 7, 9])時(shí),reduce函數(shù)將做如下計(jì)算: 先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4; 再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9; 再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16; 再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25; 由于沒(méi)有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。
上述計(jì)算實(shí)際上是對(duì)list的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是利用reduce求和也很簡(jiǎn)單。
reduce還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。 如果把初始值設(shè)為100,計(jì)算:
reduce(f, [1, 3, 5, 7, 9], 100)結(jié)果將變?yōu)?25,因?yàn)榈谝惠営?jì)算是:計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。
四、filter函數(shù) filter函數(shù)可以對(duì)序列做過(guò)濾處理,就是說(shuō)可以使用一個(gè)自定義的函數(shù)過(guò)濾一個(gè)序列,把序列的每一項(xiàng)傳到自定義的過(guò)濾函數(shù)里處理,并返回結(jié)果做過(guò)濾。最終一次性返回過(guò)濾后的結(jié)果。 和map類(lèi)似,filter也接收一個(gè)函數(shù)和一個(gè)序列。和map不同的時(shí),filter把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
語(yǔ)法
filter(func, seq)例子
l = [100, 20, 24, 50, 110]new = list(filter(lambda x: x<50, l)) #py3得套個(gè)list來(lái)轉(zhuǎn)化,便于打印出來(lái)print(new)熟練運(yùn)用以上三個(gè)玩意兒,你就可以一行寫(xiě)出幾乎所有的復(fù)雜計(jì)算了。
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注