2012-06-09 4 views
5

나는 간단한 것을 놓치고 있어야한다는 것을 알고 있지만, 나는 그것을 보지 않고있다.생성기 수식 v 수율 : 왜 'next()'가 작동하지 않습니까?

이 같은 발전기 표현이있는 경우 :

>>> serializer=(sn for sn in xrange(0,sys.maxint)) 

내가 쉽게 생성 할 수 있습니다,이 같은 개별 정수 :

>>> serializer.next() 
0 
>>> serializer.next() 
1 
>>> serializer.next() 
2 

이 같은 발전기 작성하는 경우 :

>>> def ser(): 
... for sn in xrange(0,100000): 
...  yield sn 

부에노 :

>>> ser().next() 
0 
>>> ser().next() 
0 
>>> ser().next() 
0 

??? 나는 무엇을 놓치고 있는가 ???

답변

19

ser() 발전기를 작성합니다. 따라서 ser()으로 전화 할 때마다 새로운 발전기 인스턴스가 전송됩니다. 당신은 단지 표현처럼 사용할 필요가 : 그것은 이 방법 일을하지 않았다 경우

serializer = ser() 
serializer.next() 

는 것을 고려, 당신은 오직 한 번 ser() 기능을 사용할 수 있고 당신은 그것을 다시하지 않을 수 있습니다. 또한 ser 함수를 변경하여 최대 정수를 허용하고 프로그램의 유연성을 높일 수 있습니다.

def ser(n=sys.maxint): 
    for sn in xrange(0, n): 
     yield sn 
+1

Thx! 나는 그것이 단순해야만한다는 것을 알았다. – dawg

+2

문제 없음. 이 작업을하는 다른 주요 유형의 함수 (데코레이터)에는 명시 적으로 'return wrapper'가 포함되어 있기 때문에 명확하지 않습니다.'yield' 문에 의해 암시 적이거나 마술처럼 생성됩니다. P –

4
ser() 

새로운 발생 때마다 초기화합니다.

은 같은 것을 할 해결하려면 :

s = ser() 
next(s) # next is preferred over .next which is why .next has been removed in Py3 
next(s) 
5

두 번째 예에서는 새로운 생성기로 시작하여 새 인스턴스를 계속 작성합니다.

g = ser() 
g.next() 
g.next() 

발전기를 한 번 만들고 다시 사용하십시오.