引言 Functional Programming(函數(shù)式編程)的概念最早起源于LISP,由約翰·麥卡錫在1958年創(chuàng)立,最早提出了自動(dòng)垃圾回收的理念,這一理念現(xiàn)在也被Python/Java/Ruby等多種語(yǔ)言借鑒。發(fā)展到今天,LISP已經(jīng)衍生出了多種方言。相比面向?qū)ο缶幊?,函?shù)式編程的一大優(yōu)勢(shì)就是Immutable Data(數(shù)據(jù)不可變),就是不依賴于外部的數(shù)據(jù),而且也不改變外部數(shù)據(jù)的值,這種思想可以大大減少我們代碼的Bug,而且函數(shù)式編程也支持我們像使用變量一樣使用函數(shù)。Python作為面向?qū)ο笳Z(yǔ)言,也提供了對(duì)于函數(shù)式編程的支持,雖然并不是那么純粹,而且也不支持尾遞歸優(yōu)化。 lambda的使用 lambda即匿名函數(shù),合理地使用lambda不僅可以減少我們的代碼量,而且也可以更好地描繪代碼邏輯,比如現(xiàn)在我們有下面這樣一個(gè)函數(shù)。
這個(gè)函數(shù)如果我們用lamda改寫的話,只要一行代碼就夠了。
map的使用 map(function, iterable)接收兩個(gè)參數(shù),第一個(gè)參數(shù)代表的是接收一個(gè)函數(shù),第二個(gè)參數(shù)代表的是接收一個(gè)iteralbe類型的對(duì)象,比如list。 map函數(shù)的原理是: 1.每次從iterable中取出一個(gè)參數(shù),2.將這個(gè)參數(shù)傳遞給我們的函數(shù),3.然后函數(shù)返回的值加入一個(gè)list(這種說法不準(zhǔn)確,只是為了幫助大家理解,后面我會(huì)解釋)。等所有的iterable對(duì)象遍歷完,map就把這個(gè)list返回給我們的調(diào)用者。下面我們直接通過實(shí)例來了解一下map的用法。 example1
example2 對(duì)于map的第二個(gè)參數(shù),我們也可以傳遞一組函數(shù)列表進(jìn)去,也就是說列表中間包含多個(gè)函數(shù)對(duì)象。
reduce的使用 與map一樣,reduce(function, iterable)也接收兩個(gè)參數(shù),第一個(gè)參數(shù)代表的是接收一個(gè)函數(shù),第二個(gè)參數(shù)代表的是接收一個(gè)iteralbe類型的對(duì)象,比如list。不過不同的地方在于reduce中的這個(gè)函數(shù)必須要接收兩個(gè)參數(shù),下面我們來通過求一個(gè)list(列表)累加和的例子來了解一下reduce的用法。
filter的使用 和map/reduce類似,filter(function, iterable)一次也接收兩個(gè)參數(shù),一個(gè)參數(shù)是函數(shù),另外一個(gè)參數(shù)是iterable對(duì)象,從名字也可以看出,filter用于過濾iterble對(duì)象,比如說list(列表)。 它的原理是每次從iterable對(duì)象中取出一個(gè)元素作用于我們的function,如果function返回True就保留該元素,如果返回False就刪除該元素。下面我們通過一個(gè)實(shí)例來看一下filter的用法。
裝飾器 裝飾器(decorator)是一種高級(jí)Python語(yǔ)法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。合理地使用裝飾器可以減少我們的代碼量以及提高程序的可讀型,在很多Python框架中,比如Django中我們可以大量看到裝飾器的身影。
現(xiàn)在我們有上面兩個(gè)函數(shù),分別用來求加法和乘法,但是現(xiàn)在我們覺得功能不夠,想在返回結(jié)果前添加一些輸出語(yǔ)句,一般來說我們要重構(gòu)兩個(gè)函數(shù),就向下面這樣。
如果使用裝飾器我們可以像下面這樣做,雖然現(xiàn)在我們這種情形看起來使用裝飾器并沒有什么優(yōu)勢(shì),但是如果我們要添加的不止一條打印功能,以及除了add/multiply我們還有minus/divide等函數(shù),這個(gè)時(shí)候裝飾器的威力就體現(xiàn)出來了,我們只用修改一處代碼即可,這樣不僅提高了程序的可讀性而且也為以后我們重構(gòu)代碼省去了很多的工作量。
來源:ZiWenXie |
|