作者: 機械伯爵
日時: 2007/9/18(17:45)
 ども、機械す。
 ブログの方で、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/