2013-08-15 13 views
5

Powoli zaczynam oblewać głowę wokół generatorów Pythona.Powracanie generatora z funkcji

Na razie nie jest to prawdziwy problem, nadal zastanawiam się, dlaczego nie mogę zwrócić generatora z funkcji.

Kiedy zdefiniuję funkcję z yield, działa ona jak generator. Ale jeśli zdefiniuję to jako inną funkcję i spróbuję zwrócić to, otrzymam zwykłą funkcję, tj. Nie będę generował generatora z metodą next.

Innymi słowy, dlaczego kod give_gen() w poniższym kodzie nie działa?

#!/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 

Dlaczego nie mogę zwrócić generatora z funkcji?

Odpowiedz

7

Funkcja generatora zwraca generator tylko pod numerem. Zadzwoń fn stworzyć obiekt generatora:

return fn() 

lub zadzwoń zwrócony obiekt:

g = give_gen(3)() 

Ty zrobił wezwanie gen(); Gdybyś odniósł się do po prostugen bez wywoływania go, będziesz miał odwołanie do tej funkcji.

Powiązane problemy