2017-03-09 89 views
1

我有一个简单的树类,我需要能够遍历叶节点只。如何返回值,但保持执行

我将数据添加到我的树如下:

p = ParamTree() 
p.add('system.screen.timeout') 
p.add('system.screen.lock.enabled') 
p.add('system.screen.lock.code') 

,我希望能够得到timeoutenabledcode顺序。

如果我写一个函数来打印值,它按预期工作:

def print_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      print_nodes(node) 
     else: 
      print(node) 

输出:

>>> print_nodes(p) 
timeout 
enabled 
code 

我如何去实现发电机,其做同样的事情?我尝试用yield替换print(),但它不起作用。

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield_nodes(node) 
     else: 
      yield node 

输出:

>>> g = yield_nodes(p) 
>>> for n in g: 
... print(n) 
... 
>>> 

回答

2

我会假设你yield_nodes发电机写入如下:

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield_nodes(node) 
     else: 
      yield node 

正如你可能已经注意到,称yield_nodes回报发生器(即你可以迭代),但你实际上没有做任何事情。我建议的解决方案如下:

def yield_nodes(tree): 
    for node in tree.nodes: 
     if node.has_children(): 
      yield from yield_nodes(node) 
     else: 
      yield node