2013-08-15 2 views
5

나는 천천히 파이썬 생성기 주위에서 머리를 감싸고있다.함수에서 생성기를 반환하는 것

현재 현실적인 문제는 아니지만, 왜 나는 함수에서 생성기를 반환 할 수 없는지 궁금합니다.

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 

왜 함수에서 생성기를 반환 할 수 없습니까?

답변

7

생성기 함수는이라고하는 경우에만 생성자 을 반환합니다. 반환 된 객체를

return fn() 

또는 전화 : 발전기 개체를 만들 fn 전화

g = give_gen(3)() 

당신 했다 전화 gen(); gen이라고 부르지 않고 해당 함수에 대한 참조를 얻었습니다.

관련 문제