引言
Functional Programming(函數(shù)式編程)的概念最早起源于LISP,由約翰·麥卡錫在1958年創(chuàng)立试读,最早提出了自動垃圾回收的理念,這一理念現(xiàn)在也被Python/Java/Ruby等多種語言借鑒。發(fā)展到今天裂逐,LISP已經(jīng)衍生出了多種方言。相比面向?qū)ο缶幊唐唬瘮?shù)式編程的一大優(yōu)勢就是Immutable Data(數(shù)據(jù)不可變)卜高,就是不依賴于外部的數(shù)據(jù)弥姻,而且也不改變外部數(shù)據(jù)的值,這種思想可以大大減少我們代碼的Bug掺涛,而且函數(shù)式編程也支持我們像使用變量一樣使用函數(shù)庭敦。Python作為面向?qū)ο笳Z言,也提供了對于函數(shù)式編程的支持薪缆,雖然并不是那么純粹秧廉,而且也不支持尾遞歸優(yōu)化。
lambda的使用
lambda即匿名函數(shù)拣帽,合理地使用lambda不僅可以減少我們的代碼量疼电,而且也可以更好地描繪代碼邏輯,比如現(xiàn)在我們有下面這樣一個函數(shù)减拭。
>>>deff(x):
...returnx+x
# 調(diào)用這個函數(shù)
>>>f(2)
4
這個函數(shù)如果我們用lamda改寫的話蔽豺,只要一行代碼就夠了。
# lambda后面的x表示lambda函數(shù)要接收的參數(shù)拧粪,x + x表示lambda函數(shù)所要返回的值
>>>f=lambdax:x+x
# 可以看到f現(xiàn)在也是一個函數(shù)對象
>>>f
>
# 調(diào)用lambda函數(shù)
>>>f(2)
4
map的使用
map(function, iterable)接收兩個參數(shù)修陡,第一個參數(shù)代表的是接收一個函數(shù),第二個參數(shù)代表的是接收一個iteralbe類型的對象可霎,比如list魄鸦。
map函數(shù)的原理是: 1.每次從iterable中取出一個參數(shù),2.將這個參數(shù)傳遞給我們的函數(shù)啥纸,3.然后函數(shù)返回的值加入一個list(這種說法不準(zhǔn)確号杏,只是為了幫助大家理解,后面我會解釋)斯棒。等所有的iterable對象遍歷完盾致,map就把這個list返回給我們的調(diào)用者。下面我們直接通過實例來了解一下map的用法荣暮。
example1
# 還是用我們上面那個lambda的例子
>>>function=lambdax:x+x
# 定義一個iterable對象list(列表)
>>>iterable=[1,2,3,4,5,6,7,8,9]
# 函數(shù)fucntion每次從iterable中取出一個參數(shù)x庭惜,然后function返回x + x的值,
# 并將返回值加入一個新建的list穗酥,等將iterable遍歷完护赊,map就將這個新建的list返回。
>>>v=map(function,iterable)
# 注意上面的說法并不準(zhǔn)確砾跃,只是為了幫助大家理解骏啰,其實map返回的是一個map對象,并不是list
>>>v
# 但是我們可以調(diào)用內(nèi)建的list函數(shù)將map轉(zhuǎn)換成一個list來得到我們想要的結(jié)果
>>>list(v)
[2,4,6,8,10,12,14,16,18]
example2
對于map的第二個參數(shù)抽高,我們也可以傳遞一組函數(shù)列表進去判耕,也就是說列表中間包含多個函數(shù)對象。
>>>multiply=lambdax:x*x
>>>add=lambdax:x+x
>>>funcs=[multiply,add]
>>>list(map(lambdaf:f(1),funcs))
[1,2]
reduce的使用
與map一樣翘骂,reduce(function, iterable)也接收兩個參數(shù)壁熄,第一個參數(shù)代表的是接收一個函數(shù)帚豪,第二個參數(shù)代表的是接收一個iteralbe類型的對象,比如list草丧。不過不同的地方在于reduce中的這個函數(shù)必須要接收兩個參數(shù)狸臣,下面我們來通過求一個list(列表)累加和的例子來了解一下reduce的用法。
fromfunctoolsimportreduce
# 使用lambda定義一個函數(shù)昌执,函數(shù)的作用是接收兩個參數(shù)烛亦,然后返回兩個參數(shù)之和
>>>function=lambdax,y:x+y
>>>iterable=[1,2,3,4,5,6,7,8,9]
# 函數(shù)function每次接收兩個參數(shù),除第一次外每次從iterable中取一個元素作為一個參數(shù)
# 另外一個參數(shù)取自上一次function返回的值
>>>reduce(function,iterable)
45
filter的使用
和map/reduce類似仙蚜,filter(function, iterable)一次也接收兩個參數(shù)此洲,一個參數(shù)是函數(shù),另外一個參數(shù)是iterable對象委粉,從名字也可以看出呜师,filter用于過濾iterble對象,比如說list(列表)贾节。
它的原理是每次從iterable對象中取出一個元素作用于我們的function汁汗,如果function返回True就保留該元素,如果返回False就刪除該元素栗涂。下面我們通過一個實例來看一下filter的用法知牌。
# 定義一個函數(shù),如果接收的字符s為空斤程,那么返回False角寸,如果為非空,那么返回True
>>>function=lambdas:sands.strip()
>>>iterable=['AJ',' ','Stussy','','CLOT','FCB',None]
>>>filter(function,iterable)
>>>list(filter(function,iterable))
['AJ','Stussy','CLOT','FCB']
裝飾器
裝飾器(decorator)是一種高級Python語法忿墅。裝飾器可以對一個函數(shù)扁藕、方法或者類進行加工。合理地使用裝飾器可以減少我們的代碼量以及提高程序的可讀型疚脐,在很多Python框架中亿柑,比如Django中我們可以大量看到裝飾器的身影。
>>>defadd(x,y):
...returnx+y
...
>>>defmultiply(x,y):
...returnx*y
...
現(xiàn)在我們有上面兩個函數(shù)棍弄,分別用來求加法和乘法望薄,但是現(xiàn)在我們覺得功能不夠,想在返回結(jié)果前添加一些輸出語句呼畸,一般來說我們要重構(gòu)兩個函數(shù)痕支,就向下面這樣。
>>>defadd(x,y):
...print("input:",x,y)
...returnx+y
...
>>>defmultiply(x,y):
...print("input:",x,y)
...returnx*y
...
如果使用裝飾器我們可以像下面這樣做蛮原,雖然現(xiàn)在我們這種情形看起來使用裝飾器并沒有什么優(yōu)勢采转,但是如果我們要添加的不止一條打印功能,以及除了add/multiply我們還有minus/divide等函數(shù),這個時候裝飾器的威力就體現(xiàn)出來了故慈,我們只用修改一處代碼即可,這樣不僅提高了程序的可讀性而且也為以后我們重構(gòu)代碼省去了很多的工作量框全。
defdecorator(F):
defnew_function(x,y):
print("input:",x,y)
returnF(x,y)
returnnew_function
@decorator
defadd(x,y):
returnx+y
@decorator
defmultiply(x,y):
returnx*y我有建立一個python學(xué)習(xí)交流群察绷,在群里我們相互幫助,相互關(guān)心津辩,相互分享內(nèi)容拆撼,這樣出問題幫助你的人就比較多,群號是301喘沿,還有056闸度,最后是051,這樣就可以找到大神聚合的群蚜印,如果你只愿意別人幫助你莺禁,不愿意分享或者幫助別人,那就請不要加了窄赋,你把你會的告訴別人這是一種分享哟冬。如果你看了覺得還可以的麻煩給我點個贊謝謝