Python 函數(shù)式編程入門教程

引言

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,這樣就可以找到大神聚合的群蚜印,如果你只愿意別人幫助你莺禁,不愿意分享或者幫助別人,那就請不要加了窄赋,你把你會的告訴別人這是一種分享哟冬。如果你看了覺得還可以的麻煩給我點個贊謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忆绰,隨后出現(xiàn)的幾起案子浩峡,更是在濱河造成了極大的恐慌,老刑警劉巖错敢,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翰灾,死亡現(xiàn)場離奇詭異,居然都是意外死亡稚茅,警方通過查閱死者的電腦和手機纸淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峰锁,“玉大人萎馅,你說我怎么就攤上這事『缃” “怎么了糜芳?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魄衅。 經(jīng)常有香客問我峭竣,道長,這世上最難降的妖魔是什么晃虫? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任皆撩,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扛吞。我一直安慰自己呻惕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布滥比。 她就那樣靜靜地躺著亚脆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盲泛。 梳的紋絲不亂的頭發(fā)上濒持,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音寺滚,去河邊找鬼柑营。 笑死,一個胖子當(dāng)著我的面吹牛村视,可吹牛的內(nèi)容都是我干的官套。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蓖议,長吁一口氣:“原來是場噩夢啊……” “哼虏杰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勒虾,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤纺阔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后修然,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛钝,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年愕宋,在試婚紗的時候發(fā)現(xiàn)自己被綠了玻靡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡中贝,死狀恐怖囤捻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邻寿,我是刑警寧澤蝎土,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站绣否,受9級特大地震影響誊涯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒜撮,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一暴构、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦取逾、人聲如沸耗绿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缭乘。三九已至,卻和暖如春琉用,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背策幼。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工邑时, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人特姐。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓晶丘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唐含。 傳聞我的和親對象是個殘疾皇子浅浮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容