私はゆっくりと 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
関数からジェネレーターを返せないのはなぜですか?