如何在 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
假设我正在使用递归生成器遍历二叉树,并且我希望在满足特定条件时停止遍历:
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