這一陣子練習函數式,隱隱約約發現從命令式過渡到函數式有一些模式可循,但還沒很能抓得住,在這邊略作筆記一下,另一方面,最近在看 MapReduce,也是隱隱約約感覺,這種模式,有助於使用 MapReduce 時對資料的分析,總之這是一個典型的例子之一,來試著收集更多的例子,看看能不能歸類出一些模式 ... XD
將命令式更改為函數式,需要乾淨點的程式碼與對流程的敏感度,典型範例像是:
def max(visits, time):
num = 0
for t in range(len(visits[0])):
if time > visits[0][t]:
num += 1
if time > visits[1][t]:
num -= 1
return num
這個函式可以改為:
def max(visits, time):
num = 0
for t in range(len(visits[0])):
num = num + 1 if time > visits[0][t] else num
num = num - 1 if time > visits[1][t] else num
return num
目前流程中雖然只有一個 for 迴圈,但事實上處理了兩件事,函數式基本上就是強迫你分解問題,所以混有兩件事時,就不容易寫出函數式,上面的函式可以改為:
def max(visits, time):
num = 0
for t in range(len(visits[0])):
num = num + 1 if time > visits[0][t] else num
for t in range(len(visits[1])):
num = num - 1 if time > visits[1][t] else num
return num
接下來看到用 for 對 list 計算出某數,其實是典型的 reduce,所以可以改為:
from functools import reduce
def max(visits, time):
return reduce(lambda num, t: num - 1 if time > t else num, visits[1],
reduce(lambda num, t: num + 1 if time > t else num, visits[0] , 0))