【问题标题】:Best way of getting both the yield'ed output and return'ed value of a generator in Python在 Python 中获取生成器的输出和返回值的最佳方法
【发布时间】:2022-01-20 18:41:11
【问题描述】:

给定一个带有返回值的简单生成器:

def my_generator():
    yield 1
    yield 2
    return 3

我正在寻找一个简单的函数,它返回生成的列表和返回值。

>>> output_and_return(my_generator())
([1, 2], 3)

似乎没有任何干净的方法可以做到这一点。在另一个生成器中,您可以使用value = yield from my_generator(),它会为您获取返回值,但不会直接为您提供输出列表本身。

我能想到的最接近的方法是将它包裹在一个捕获返回值的迭代器上:

class Generator:
    def __init__(self, gen):
        self.gen = gen

    def __iter__(self):
        self.value = yield from self.gen
    
    def output_and_return(self):
        return list(self), self.value

Generator(my_generator()).output_and_return()

这很有效,但绝不简单或干净。有谁知道一种更简单的方法来提取值列表以及生成器的返回值而不将其包装在另一个类中?

【问题讨论】:

标签: python generator


【解决方案1】:

我想我们可以像这样从StopIteration 异常中提取它:

def output_and_return(iterator):
  output = []
  try:
    while True:
      output.append(next(iterator))
  except StopIteration as e:
    return output, e.value

不是最干净的代码,但比替代类好很多。

【讨论】:

    【解决方案2】:

    不将其包装在另一个类中?

    也许只需要一个函数?

    版本 1:

    def output_and_return(it):
        def with_result():
            yield (yield from it)
        *elements, result = with_result()
        return elements, result
    

    版本 2:

    def output_and_return(it):
        result = None
        def get_result():
            nonlocal result
            result = yield from it
        return list(get_result()), result
    

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 2022-11-27
      • 1970-01-01
      • 2013-08-16
      • 2021-01-16
      • 2019-01-31
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多