Python生成器:正确的代码递归树

时间:2011-10-03 11:24:55

标签: python recursion generator

class Node(object):
    def __init__(self, lst):
        if type(lst) == list:
            self.value = lst[0]
            self.children = lst[1:]
        else:
            self.value = lst
            self.children = []
    @property
    def ChildElements(self):
        return [Node(a) for a in self.children]

    @property
    def GetValue(self):
        return self.value

def node_recurse_generator(node):
    yield node.value
    for n in node.ChildElements:
        node_recurse_generator(n)

Node是一个简单的树状数据结构。列表的第一个元素始终是Node的值,其他元素将是子元素。如果使用除列表之外的其他内容启动节点,则该值将为该值,并且子节点将为[],空列表。

a = Node([1,[10,20,30],[100,200,300]])
>>> list(node_recurse_generator(a))
[1]

现在,在所有元素上都有一个递归迭代器会很棒,但是我的生成器只产生第一个元素。为什么会这样?

2 个答案:

答案 0 :(得分:15)

简单地递归调用node_recurse_generator是不够的 - 您必须yield其结果:

def node_recurse_generator(node):
    yield node.value
    for n in node.ChildElements:
        for rn in node_recurse_generator(n):
            yield rn

答案 1 :(得分:4)

正如在顶部答案的评论中提到的yak,您也可以在Python 3.3之后使用yield from

def node_recurse_generator(node):
    yield node.value
    for n in node.ChildElements:
        yield from node_recurse_generator(n)