命令式至函數式隨記(一)

English

這一陣子練習函數式,隱隱約約發現從命令式過渡到函數式有一些模式可循,但還沒很能抓得住,在這邊略作筆記一下,另一方面,最近在看 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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值