如何在 Python 中停止递归生成器?

How to stop a recursive generator in Python?

假设我正在使用递归生成器遍历二叉树,并且我希望在满足特定条件时停止遍历:

def traverse(node):
    if node is None:
        return

    yield from traverse(node.left)

    if node.val == 5:
        return # return only skips node 5, but doesn't fully stop iteration. What does?

    yield node.val

    yield from traverse(node.right)

你是如何做到这一点的?

我尝试加注 StopIteration,但结果是 RuntimeException

将停止和迭代分成两部分:

from itertools import takewhile

def traverse(node, stop_value):
    yield from takewhile(lambda x: x != stop_value, _traverse(node))

def _traverse(node):
    if node is None:
        return
    yield from _traverse(node.left)
    yield node.val
    yield from _traverse(node.left)
    

您应该控制迭代何时从任何代码调用停止 traverse():

def traverse(node):
    if node is None:
        return

    yield from traverse(node.left)

    yield node.val

    yield from traverse(node.right)
for n in traverse(node):
    if n == 5:
        break