从函数返回生成器

时间:2013-08-15 12:23:04

标签: python function generator

我正慢慢地围绕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

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

1 个答案:

答案 0 :(得分:7)

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

return fn()

或调用返回的对象:

g = give_gen(3)()

致电gen();如果您在没有调用它的情况下引用了 gen,您就会引用该函数。