- 零基礎(chǔ)入門學(xué)習(xí)Python(第2版)
- 小甲魚
- 1013字
- 2019-12-20 12:19:42
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]
- INSTANT Mock Testing with PowerMock
- SQL Server 從入門到項(xiàng)目實(shí)踐(超值版)
- 復(fù)雜軟件設(shè)計(jì)之道:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)全面解析與實(shí)戰(zhàn)
- Clojure for Domain:specific Languages
- Yocto for Raspberry Pi
- Linux操作系統(tǒng)基礎(chǔ)案例教程
- Mastering Android Game Development
- Getting Started with LLVM Core Libraries
- 新一代SDN:VMware NSX 網(wǎng)絡(luò)原理與實(shí)踐
- Android傳感器開發(fā)與智能設(shè)備案例實(shí)戰(zhàn)
- Django 3.0入門與實(shí)踐
- 一覽眾山小:ASP.NET Web開發(fā)修行實(shí)錄
- Python Penetration Testing Essentials
- C語言從入門到精通(第5版)
- 三步學(xué)Python