【问题标题】:Mixing functions and generators混合函数和生成器
【发布时间】:2020-03-04 10:10:36
【问题描述】:

所以我正在编写一个函数,其中大量处理发生在循环体中,有时调用者可能会感兴趣的是获得某些计算的答案。

通常我会将结果放在一个列表中并返回该列表,但在这种情况下,结果太大(每个循环几百 MB)。

我没有真正考虑就写了这篇文章,期望 Python 的动态类型能够解决问题,但以下内容始终是作为生成器创建的。

def mixed(is_generator=False):
    for i in range(5):
        # process some stuff including writing to a file
        if is_generator:
            yield i
    return

由此我有两个问题:

1) 作用域中存在yield 关键字是否会立即将对象变成生成器?

2) 有没有明智的方法来获得我想要的行为?

2.1) 如果不是,那么不可能的原因是什么? (就函数和生成器在 Python 中的工作方式而言。)

【问题讨论】:

    标签: python python-3.x generator


    【解决方案1】:

    让我们一步一步来:

    1) 在作用域中出现 yield 关键字是否会立即将对象变成生成器?是的

    2) 有没有一种明智的方法来获得我想要的行为?是的,请参见下面的示例

    问题是包装计算并返回一个生成器或包含该生成器数据的列表:

    def mixed(is_generator=False):
        # create a generator object
        gen = (compute_stuff(i) for i in range(5))
        # if we want just the generator
        if is_generator:
            return gen
        # if not we consume it with a list and return that list
        return list(gen)
    

    无论如何,我会说这是一种不好的做法。你应该把它分开,通常只有生成器函数,然后在外面使用一些逻辑:

    def computation():
        for i in range(5):
            # process some stuff including writing to a file
            yield i
    
    gen = computation()
    if lazy:
        for data in gen:
            use_data(data)
    else:
        data = list(gen)
        use_all_data(data)
    

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多