Python函數(shù)式編程:map/reduce
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
作為一種抽象程度極高的編程范式,函數(shù)式編程的最大特點(diǎn)就是允許函數(shù)本身作為一個參數(shù)傳入另一個函數(shù),并且也可以返回一個函數(shù)。本文介紹Python函數(shù)式編程的兩個極為重要的函數(shù):map和reduce。在介紹這兩個函數(shù)前,先簡單說下什么是高階函數(shù)。
我們求平方根函數(shù)的例子來解釋什么是高階函數(shù)。
> math.sqrt(16)4.0> math.sqrt<built-in function math.sqrt>
由上可見,math.sqrt(16)是函數(shù)調(diào)用,而math.sqrt則是函數(shù)本身。Python允許將函數(shù)本身賦值給一個變量,所以我們可以看到如下效果:
> f = math.sqrt> f<built-in function math.sqrt>
于是我們可以得到結(jié)論:Python中變量可以指向函數(shù)。
變量可以指向函數(shù),函數(shù)的參數(shù)可以接受變量,那一個函數(shù)就可以接受另一個函數(shù)作為參數(shù),這樣的函數(shù)我們稱之為高階函數(shù)。
def add(x,y,f):return f(x)+f(y)> add(16,9,math.sqrt)7.0
作為Python函數(shù)式編程的代表,你可以將map函數(shù)理解為數(shù)學(xué)上的映射,map函數(shù)接受兩個參數(shù),一個是函數(shù),另一個則是函數(shù)所作用的可迭代對象。map將函數(shù)依次作用在可迭代對象的每一個元素上,并將結(jié)果作為一個迭代器返回。且看實(shí)例:
例如我們有一個函數(shù)f(x)=x3 ,有一個list L=[1,2,3,4,5],我們就可以用map函數(shù)來將函數(shù)作用到這個可迭代對象list上:
> def f(x):... return x*x*x...> L = [1, 2, 3, 4, 5]> L2 = map(f, L)> list(L2)[1, 8, 27, 64, 125]
map函數(shù)的好處是可以將運(yùn)算規(guī)則抽象化,對于簡單函數(shù)我們也許不能體會到方便之處,但對于復(fù)雜函數(shù),map的便利性是顯而易見的。例如將一個list里面所有數(shù)字轉(zhuǎn)化為字符串只需要一行代碼:
>>> list(map(str, [1, 2, 3]))['1', '2', '3']
如果說map函數(shù)理解為映射的話,那reduce函數(shù)則可以理解為歸約或者迭代。reduce函數(shù)也只接受兩個參數(shù),一個是歸約函數(shù),一個是函數(shù)所作用的可迭代對象。reduce將一個函數(shù)f作用在一個list上的迭代思想如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) 例如我們想要將一個序列[1,2,3,4,5]變成整數(shù)12345,用reduce函數(shù)可寫為:
from functools import reducedef fn(x, y):return x * 10 + y...reduce(fn, [1, 2, 3, 4, 5])12345
這里僅簡單的對map和reduce函數(shù)做個簡單筆記,內(nèi)容不多,但關(guān)鍵在于掌握其函數(shù)式編程的思想精髓。借助于map/reduce的函數(shù)式編程思想,Hadoop的大數(shù)據(jù)處理工具M(jìn)apReduce已經(jīng)將該思想作為一種編程模型,進(jìn)行大規(guī)模數(shù)據(jù)集的并行運(yùn)算了。等小編將來學(xué)習(xí)了Hadoop,再來仔細(xì)說說MapReduce吧。
好消息!
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個基于OpenCV實(shí)現(xiàn)20個實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

