【问题标题】:Returning generator from a function从函数返回生成器
【发布时间】:2013-08-15 12:23:04
【问题描述】:

我正在慢慢开始围绕 Python 生成器。

虽然现在这不是现实生活中的问题,但我仍然想知道为什么我不能从函数中返回生成器。

当我用yield 定义一个函数时,它充当了一个生成器。但是,如果我将它在另一个函数中定义并尝试返回它,我会得到一个普通函数,即不是具有next 方法的生成器。

换句话说,为什么下面代码中的give_gen() 方法不起作用?

#!/usr/bin/python

import time

def gen(d):
    n = 0
    while True:
        n = n + d
        time.sleep(0.5)
        yield n

def give_gen(d):
    def fn():
        n = 0
        while True:
            n = n + d
            time.sleep(0.5)
            yield n
    return fn

if __name__ == '__main__':

    g = give_gen(3)     # does not work
    g = gen(3)          # works well

    while True:
        print g.next()
        # AttributeError: 'function' object has no attribute 'next'
        # in case of give_gen

为什么我不能从函数中返回生成器?

【问题讨论】:

    标签: python function generator


    【解决方案1】:

    生成器函数仅在调用时返回一个生成器。调用fn创建生成器对象:

    return fn()
    

    或者调用返回的对象:

    g = give_gen(3)()
    

    你确实打电话给gen();如果你提到只是gen而不调用它,你就会有对该函数的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2017-02-08
      • 1970-01-01
      相关资源
      最近更新 更多