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]
现在,在所有元素上都有一个递归迭代器会很棒,但是我的生成器只产生第一个元素。为什么会这样?
答案 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)