レシピ追加、多次元配列をループする
再帰関数で書いたことはあったけれど、再帰ジェネレータ? で書いたのは初めて。
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