Python 如何返回一个值,但继续执行

Python 如何返回一个值,但继续执行,python,python-3.x,Python,Python 3.x,我有一个简单的树类,我只需要能够在叶节点上迭代 我将数据添加到我的树中,如下所示: p = ParamTree() p.add('system.screen.timeout') p.add('system.screen.lock.enabled') p.add('system.screen.lock.code') def yield_nodes(tree): for node in tree.nodes: if node.has_children():

我有一个简单的树类,我只需要能够在叶节点上迭代

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

p = ParamTree()
p.add('system.screen.timeout')
p.add('system.screen.lock.enabled')
p.add('system.screen.lock.code')
def yield_nodes(tree):
    for node in tree.nodes:
        if node.has_children():
            yield_nodes(node)
        else:
            yield node
我希望能够依次获得
timeout
enabled
code

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

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
>>> g = yield_nodes(p)
>>> for n in g:
...   print(n)
...
>>>
我如何实现一个做同样事情的生成器?我尝试将
print()
替换为
yield
,但不起作用

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

>>> print_nodes(p)
timeout
enabled
code
>>> g = yield_nodes(p)
>>> for n in g:
...   print(n)
...
>>>

我假设您的
yield\u节点
生成器编写如下:

p = ParamTree()
p.add('system.screen.timeout')
p.add('system.screen.lock.enabled')
p.add('system.screen.lock.code')
def yield_nodes(tree):
    for node in tree.nodes:
        if node.has_children():
            yield_nodes(node)
        else:
            yield node
正如您可能注意到的,调用
yield\u nodes
将返回一个生成器(您可以对其进行迭代),但实际上您并没有对其进行任何操作。我提议的解决办法如下:

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