gpt4 book ai didi

python - 从 Python 中的 block 中停止生成器

转载 作者:太空狗 更新时间:2023-10-30 01:45:21 24 4
gpt4 key购买 nike

我有一个生成器,它从有向无环图 (DAG) 中生成节点,深度优先:

def depth_first_search(self):
yield self, 0 # root
for child in self.get_child_nodes():
for node, depth in child.depth_first_search():
yield node, depth+1

我可以像这样遍历节点

for node, depth in graph.depth_first_search():
# do something

如果满足某些条件,我希望能够从 for 循环中告诉生成器停止在图中深入。

我提出了以下使用外部函数的解决方案。

def depth_first_search(self, stop_crit=lambda n,d: False):
yield self, 0 # root
for child in self.get_child_nodes():
for node, depth in child.depth_first_search():
yield node, depth+1
if stop_crit(node, depth): break

此解决方案强制我在定义 stop_crit 之前声明我需要的变量,以便可以从中访问它们。

在 Ruby 中,yield 返回 block 中的最后一个表达式,因此可以方便地用于告诉生成器继续或停止。

在 Python 中实现此功能的最佳方法是什么?

最佳答案

通常在 Python 中,您会停止使用生成器并忘记它。观点。 (因此以通常的方式将事情留给垃圾收集器)

然而,通过使用 generator.close(),您可以强制立即进行生成器清理,从而立即触发所有终结。

例子:

>>> def gen():
... try:
... for i in range(10):
... yield i
... finally:
... print "gen cleanup"
...
>>> g = gen()
>>> next(g)
0
>>> for x in g:
... print x
... if x > 3:
... g.close()
... break
...
1
2
3
4
gen cleanup
>>> g = gen()
>>> h = g
>>> next(g)
0
>>> del g
>>> del h # last reference to generator code frame gets lost
gen cleanup

关于python - 从 Python 中的 block 中停止生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com