为什么递归发电机不起作用?

时间:2010-08-30 17:02:37

标签: python recursion generator

我有一个类,每个实例基本上都是一堆嵌套列表 其中包含许多整数或包含整数的其他列表,或者a 列表清单等,如下:

class Foo(list):
    def __init__(self):
        self.extend(
            list(1), list(2), list(3), range(5), [range(3), range(2)]
            )

我想定义一个方法来遍历嵌套列表并给我 一次一个整数,与os.walk不同。我试过这个:

def _walk(self):
    def kids(node):
        for x in node:
            try:
                for y in kids(x):
                    yield y
            except TypeError:
                yield x
    return kids(x)

但它立即引发了一场停止错误。如果我添加一个print语句来打印第一个for循环中的每个“节点”,该函数似乎以我想要的方式迭代整个容器,但不会产生每个节点。它只是在我第一次在生成器上调用next时打印它们。

我很难过。请帮忙!

2 个答案:

答案 0 :(得分:1)

如果您更改return kids(x)以返回kids(self)

,则此功能正常

答案 1 :(得分:1)

这是一个函数,它是_walk方法的一个更简单的版本,可以在任意迭代上执行您想要的操作。

。不需要内部kids功能。

def walk(xs):
    for x in xs:
        try:
            for y in walk(x):
                yield y
        except TypeError:
            yield x

这可以简单地适用于Foo对象的方法。