函數(shù)式編程或者函數(shù)程序設(shè)計(jì),又稱泛函數(shù)編程,是一種編程范式。
在Python中,函數(shù)編程主要有以下4個(gè)函數(shù)的使用構(gòu)成:lambda()、map()、reduce()、filter(),下面我們來一一講解這些函數(shù)的作用與特點(diǎn)。
匿名函數(shù)lambda
Python用def來定義一個(gè)函數(shù),def后面跟函數(shù)名字,而匿名函數(shù),顧名思義,這個(gè)函數(shù)沒有名字,因?yàn)闆]有名字,不必?fù)?dān)心函數(shù)名沖突。
匿名函數(shù)語法:lambda 參數(shù)列表 : 表達(dá)式
上圖中先將創(chuàng)建好的匿名函數(shù)通過一個(gè)變量來接收,然后在使用變量去調(diào)用匿名函數(shù),匿名函數(shù)lambda經(jīng)常與其它函數(shù)結(jié)合使用,以此來達(dá)到意想不到的效果,下面會(huì)涉及到這部分。
Map函數(shù)
Map()函數(shù)會(huì)根據(jù)提供的函數(shù)對(duì)指定的序列做映射。
語法:map(function, iterable, ……),第一個(gè)參數(shù)function為函數(shù),第二個(gè)參數(shù)iterable 為一個(gè)或者多個(gè)序列。
下圖中展示如果將列表list1中的內(nèi)容全部乘以2。
首先定義一個(gè)翻倍函數(shù)doublex,接著利用map函數(shù)將翻倍函數(shù)作用于列表中的每一個(gè)元素!
由于map函數(shù)Python 3.x版本中返回迭代器,所以用一個(gè)list函數(shù)輸入內(nèi)容。
前面我們介紹過匿名函數(shù)lambda,這里map函數(shù)結(jié)合lambda函數(shù)將會(huì)超級(jí)簡(jiǎn)潔,上面那個(gè)功能,用lambda函數(shù),一行代碼即可搞定,如下圖所示:
省去了定義函數(shù)那一步,是不是要方面簡(jiǎn)潔很多?
Reduce函數(shù)
reduce函數(shù)將一個(gè)數(shù)據(jù)集合(鏈表,元組等)中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給 reduce 中的函數(shù) function(有兩個(gè)參數(shù))先對(duì)集合中的第 1、2 個(gè)元素進(jìn)行操作,得到的結(jié)果再與第三個(gè)數(shù)據(jù)用 function 函數(shù)運(yùn)算,最后得到一個(gè)結(jié)果。
語法:reduce(function, iterable[, initializer])
Reduce函數(shù)有點(diǎn)類似于map函數(shù),但map函數(shù)用于逐一遍歷,而reduce函數(shù)用于遞歸計(jì)算,如下例中所示:
例1中先通過匿名函數(shù)創(chuàng)建一個(gè)兩數(shù)相加函數(shù),接著利用reduce函數(shù)這兩數(shù)相加函數(shù)作用在列表中,第一步先計(jì)算1+2=3,第二步3+3=6,第三步6+4=10,第四步10+5=15。
同理例2中,range(1,11)相當(dāng)于給出了一個(gè)列表[1,2,3,4,5,6,7,8,9,10],lambda構(gòu)造一個(gè)二元函數(shù),返回兩個(gè)參數(shù)的乘積。Reduce函數(shù)首先將列表的前兩個(gè)元素作為函數(shù)的參數(shù)進(jìn)行運(yùn)算,接著將運(yùn)算結(jié)果與第三個(gè)元素作為函數(shù)的參數(shù),然后再將運(yùn)算結(jié)果與第四個(gè)參數(shù)作為函數(shù)的參數(shù)……依次類推,直至列表元素結(jié)束,返回最終的結(jié)果。
需要注意的是,reduce函數(shù)在Python2.x版本中可直接使用,但是在3.x版本中,需要從functools導(dǎo)入才可以使用!
?filter函數(shù)
filter,過濾、篩選的意思,所以filter函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
語法:filter(function, iterable)
下圖中例1用來篩選列表中大于5的元素,例2先定義了一個(gè)開平方為整數(shù)的函數(shù),然后在作用于100以內(nèi)的數(shù)字,如果平方根為整數(shù),則輸出。
同map函數(shù)一樣,filter函數(shù)Python 3.x版本中返回迭代器,所以用一個(gè)list函數(shù)輸入內(nèi)容。
可以發(fā)現(xiàn),使用filter函數(shù)首先需要一個(gè)返回值為布爾型的函數(shù),如果為true,則在列表中挑出這個(gè)元素,最后將滿足條件的所有元素組合成一個(gè)列表返回。
小結(jié)
雖然很多時(shí)候以上四個(gè)函數(shù)的功能也可以用其它方式實(shí)現(xiàn),但是我們使用lambda、map、reduce、filter函數(shù)最終的目的是兼顧簡(jiǎn)潔與效率,因?yàn)檫@四個(gè)函數(shù)的循環(huán)速度要比Python內(nèi)置的for或while循環(huán)要快得多,相當(dāng)于C語言的速度。