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