官术网_书友最值得收藏!

6.4 函數(shù)式編程

函數(shù)式編程是一種古老的編程模式,就是用函數(shù)(計(jì)算)來表示程序,用函數(shù)的組合來表達(dá)程序組合的思維方式,最開始受到學(xué)術(shù)界的熱捧,近年來開始在業(yè)界被投入使用。因此,越來越多的高級(jí)語言都加入對(duì)函數(shù)式編程的支持,Python當(dāng)然也不例外。

6.4.1 lambda

視頻講解

Python允許使用lambda關(guān)鍵字來創(chuàng)建匿名函數(shù)。什么是匿名函數(shù)呢?匿名函數(shù)與普通函數(shù)在使用上有什么不同?匿名函數(shù)被發(fā)明出來的意義何在?(奪命三連問)

那先來談?wù)刲ambda表達(dá)式怎么用,然后再來討論它的意義吧。

先定義一個(gè)普通的函數(shù):

如果使用lambda語句來定義這個(gè)函數(shù),就會(huì)變成這樣:

     >>> lambda x : 2 * x +? 1
     <function <lambda> at 0x00000000007FCD08>

就像前面講過的三元操作符一樣,匿名函數(shù)在很大程度上簡(jiǎn)化了函數(shù)的定義過程。Python使用lambda關(guān)鍵字來創(chuàng)建匿名函數(shù)。

基本語法是使用冒號(hào)(:)分隔函數(shù)的參數(shù)及返回值:冒號(hào)的左邊放置函數(shù)的參數(shù),如果有多個(gè)參數(shù),使用逗號(hào)(,)分隔即可;冒號(hào)右邊是函數(shù)的返回值。

執(zhí)行完lambda語句后實(shí)際上返回一個(gè)函數(shù)對(duì)象,如果要對(duì)它進(jìn)行調(diào)用,只需要給它綁定一個(gè)臨時(shí)的名字即可:

     >>> g = lambda x : 2 * x + 1
     >>> g(5)
     11

作為對(duì)比,這是普通函數(shù):

把它轉(zhuǎn)換為lambda表達(dá)式:

     >>> g = lambda x, y : x + y
     >>> g(3, 4)
     7

前面閉包的例子也可以轉(zhuǎn)換為lambda表達(dá)式:

6.4.2 filter()

filter()函數(shù)是一個(gè)過濾器,它的作用就是在海量的數(shù)據(jù)里面提取出有用的信息。那么Python的這個(gè)filter()函數(shù)如何來實(shí)現(xiàn)過濾功能呢?

先看Python自己的注釋:

filter()這個(gè)內(nèi)置函數(shù)有兩個(gè)參數(shù):第一個(gè)參數(shù)可以是一個(gè)函數(shù)也可以是None,如果是一個(gè)函數(shù)的話,則將第二個(gè)可迭代對(duì)象里的每一個(gè)元素作為函數(shù)的參數(shù)進(jìn)行計(jì)算,把返回True的值篩選出來;如果第一個(gè)參數(shù)為None,則直接將第二個(gè)參數(shù)中為True的值篩選出來。

這么說有些讀者可能還不大理解,小甲魚還是用簡(jiǎn)單的例子幫助大家消化一下:

     >>> temp = filter(None, [1, 0, False, True])
     >>> list(temp)
     [1, True]

利用filter()函數(shù),下面嘗試編寫一個(gè)篩選奇數(shù)的過濾器:

結(jié)合前面學(xué)到的lambda表達(dá)式,就可以使用函數(shù)式編程來實(shí)現(xiàn):

     >>> list(filter(lambda x : x % 2, range(10)))
     [1, 3, 5, 7, 9]

6.4.3 map()

map在這里不是地圖的意思,在編程領(lǐng)域,map一般作“映射”來解釋。

map()這個(gè)內(nèi)置函數(shù)也有兩個(gè)參數(shù),仍然是一個(gè)函數(shù)和一個(gè)可迭代對(duì)象,將可迭代對(duì)象的每一個(gè)元素作為函數(shù)的參數(shù)進(jìn)行運(yùn)算加工,直到可迭代序列每個(gè)元素都加工完畢。

舉個(gè)例子:

     >>> list(map(lambda x : x * 2, range(10)))
     [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

map()的第二個(gè)參數(shù)是收集參數(shù),支持多個(gè)可迭代對(duì)象。map()會(huì)從所有可迭代對(duì)象中依次取一個(gè)元素組成一個(gè)元組,然后將元組傳遞給func。注意:如果可迭代對(duì)象的長(zhǎng)度不一致,則以較短的迭代結(jié)束為止。

舉個(gè)例子:

     >>> list(map(lambda x, y : x + y, [1, 3, 5], [10, 30, 50, 66, 88]))
     [11, 33, 55]
主站蜘蛛池模板: 中西区| 三明市| 睢宁县| 巩义市| 渭南市| 玉田县| 静安区| 巢湖市| 乐至县| 博乐市| 小金县| 武功县| 万山特区| 达日县| 安平县| 噶尔县| 福安市| 旬阳县| 天台县| 固安县| 宜兴市| 航空| 广水市| 灵山县| 依兰县| 特克斯县| 东宁县| 玛多县| 福州市| 嘉义市| 诏安县| 丰宁| 平邑县| 呼和浩特市| 克拉玛依市| 烟台市| 永嘉县| 仪陇县| 阿克陶县| 宿迁市| 资阳市|