如何返回值,但继续执行

时间:2017-03-09 09:31:05

标签: python python-3.x

我有一个简单的树类,我需要能够遍历叶子节点。

我将数据添加到我的树中,如下所示:

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

我如何实现同样的生成器呢?我尝试将print()替换为yield,但它无效。

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)
...
>>>

1 个答案:

答案 0 :(得分: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