銀月の符号

Python 使い見習いの日記・雑記

レシピ追加、多次元配列をループする

「088:多次元配列をループする」

再帰関数で書いたことはあったけれど、再帰ジェネレータ? で書いたのは初めて。

def traverse_unsafe(iterable):
    try:
        # イテレート可能かどうか確認
        i = iter(iterable)
    except TypeError, e:
        # イテレート不可、データなのでそのまま返す
        value = iterable
        yield value
    else:
        # イテレート可、中身を取り出して返す
        for i2 in i:
            for value in traverse_unsafe(i2):
                yield value

入力によって変な結果が出るだけならともかく、帰ってこないこともあるのが難点。直接使うのではなく、入力対象に合わせて書き直すべき一品。

>>> for i in traverse_unsafe([1, [2, 3], [[4, 5, 6]]]):
...   print i
...
1
2
3
4
5
6
>>> for s in traverse_unsafe(['foo', ['bar', 'baz']]):
...   print s
  File "<stdin>", line 12, in traverse_unsafe
      (中略)
  File "<stdin>", line 12, in traverse_unsafe
RuntimeError: maximum recursion depth exceeded