从Python生成器接收“返回”值的最佳方法

11 浏览
0 Comments

从Python生成器接收“返回”值的最佳方法

自Python 3.3以来,如果一个生成器函数返回一个值,那么这个值将成为引发的StopIteration异常的值。这可以通过以下几种方式收集:

  • yield from表达式的值,这意味着包含函数也是一个生成器。
  • 在try/except块中调用next().send()

然而,如果我只想在for循环中迭代生成器 - 最简单的方法 - 没有办法收集StopIteration异常的值,因此也就无法获得返回值。我使用一个简单的例子,其中生成器产生值,并在最后返回一些摘要(累加、平均值、计时统计等)。

for i in produce_values():
    do_something(i)
values_summary = ....??

一种方法是自己处理循环:

values_iter = produce_values()
try:
    while True:
        i = next(values_iter)
        do_something(i)
except StopIteration as e:
    values_summary = e.value

但这就放弃了for循环的简洁性。我不能使用yield from,因为那要求调用代码本身也是一个生成器。除了上面展示的自定义循环,是否有更简单的方法呢?

0