ども、機械す。
ブログの方で、Python3000は楽しい楽しいと書いてるのだけど、
色々調べてみて、reduce関数が無くなってしまったのだけは首を傾げました。
だってapplyと違って、代替が無いじゃん。
とゆーわけで、お手製のreduceとか作ってみました。
まぁ、素直なのはこんなん。
def reduce(fnc, lst):
r = lst[0]
for x in lst[1:]:
r = fnc(r, x)
return r
まぁ、チェックはしてませんが、一応コレで動きます。
で、やっぱり『悪い虫』が動いて、再帰版とか作ってしまいます。
def reduce(fnc, lst):
if len(lst) == 2:
return fnc(lst[0], lst[1])
else:
return fnc(reduce(fnc, lst[:-1]), lst[-1])
これ、動くのだけど、あんまりネストが深いと、Pythonがスタック
フローオーバーを起こします。
つか、どーも私が再帰プログラム書くとエレガントさが無いなぁ(嘆息)
def reduce(fnc, lst):
return (
(len(lst) == 2)
and
fnc(lst[0], lst[1])
or
fnc(reduce(fnc, lst[:-1]), lst[-1])
)
if-elseではなくand orにして、return 文だけにしてみました。
改行のために括弧をつけてますが、一行で書くなら、一番外側のは
基本的に要りません。
def reduce(fnc, lst):
return (
(len(lst) > 2)
and
fnc(reduce(fnc, lst[:-1]), lst[-1])
or
fnc(lst[0], lst[1])
)
条件の逆パターン。
……ネタ切れ(誰か、綺麗なの、書いて……(泣)
/機械伯爵/時間城年代記 http://blog.livedoor.jp/kikwai/