5

私はゆっくりと 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

関数からジェネレーターを返せないのはなぜですか?

4

1 に答える 1

7

ジェネレーター関数は、呼び出されたときにのみジェネレーターを返します。fnジェネレーター オブジェクトを作成するための呼び出し:

return fn()

または返されたオブジェクトを呼び出します。

g = give_gen(3)()

あなた電話しましたgen(); 呼び出さずに参照し gen場合、その関数への参照が得られます。

于 2013-08-15T12:24:46.630 に答える