从Python生成器接收“返回”值的最佳方法
- 论坛
- 从Python生成器接收“返回”值的最佳方法
11 浏览
从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
,因为那要求调用代码本身也是一个生成器。除了上面展示的自定义循环,是否有更简单的方法呢?