let式ないしlambdaは式しか渡せないしpythonのreduceいらない。
lambda
def total(r, *args): for i in args: r += i return r print total(0, 1, 2, 3, 4) # 10
という関数があったとして、合計以外の計算したい。そんな時この関数は使えない。
幸いにも、pythonにはlambda式がある。lambdaを使えば2乗和は計算できる。
def total(r,fn,*args): for i in args: r += fn(i) return r print total(0,lambda x: x*x,1,2,3,4) # 30
こうも書ける。
def square(x): return x * x print total(0,square,1,2,3,4)
総和ではなく全部かけたものとかそれ以外とか考えていくと、結局totalはreduceに他ならなくて
import operator as op print reduce(op.add [1,2,3,4],0) # total print reduce(lambda n, x : n + x * x, [1, 2, 3, 4], 0)
でも、結局lambdaは式でしかないか使えない。
(fold (lambda (x n) (let1 sq (* x x) (+ sq n))) 0 '(1 2 3 4))
結局もっと長い関数を渡そうとすると、別な名前の関数として定義しなければならなくて、それなら、ループで良いんじゃないのと思う。
pythonのlambdaは式しか渡せない(一時的な変数も使えない)牙をもがれたものだから、ぶっちゃけreduceは役立たず。