2016-08-08 6 views
3

yield 성명을 실행하고있었습니다. 파이썬 2.7에서 다음 함수를 작성했습니다 : 나는 mygen().next()는 항상 0으로 출력을 표시 호출 할 때마다next()가 항상 같은 값을 표시하는 이유는 무엇입니까?

>>> def mygen(): 
...  i = 0 
...  j = 3 
...  for k in range(i, j): 
...   yield k 
... 
>>> mygen().next() 
0 
>>> mygen().next() 
0 
>>> mygen().next() 
0 

, 대신 0, 1, 2 & StopIteration. 아무도 이것을 설명 할 수 있습니까?

답변

10

당신은 때마다 발전기를 재생성하므로 매번 처음부터 시작됩니다.

되면 발전기를 만들기 :

gen = mygen() 
gen.next() 
gen.next() 
gen.next() 

생성기 기능은 새로운 반복자에게 당신이 그들을 호출 할 때마다 생산; 그런 식으로 여러 개의 독립적 인 복사본을 생성 할 수 있습니다. 당신은 아마 대신 직접 generator.next()를 호출 next() function를 사용하려면

>>> def mygen(): 
...  i = 0 
...  j = 3 
...  for k in range(i, j): 
...   yield k 
... 
>>> gen1 = mygen() 
>>> gen2 = mygen() 
>>> gen1.next() 
0 
>>> gen1.next() 
1 
>>> gen2.next() 
0 
>>> gen2.next() 
1 
>>> gen1.next() 
2 
>>> gen1.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

참고 :

next(gen) 

generator.next()는 각각의 독립적 인 반복자는 다른 별개을 통해 강화 될 수 함수의 호출입니다 후크로 간주됩니다 (Python 3은 generator.__next__()으로 이름이 변경되고 next() 함수는 버전 간 호환 방식으로 호출하는 공식 API입니다)

0

yield 문을 포함하는 함수 정의가 생성자를 반환합니다. 함수 자체 대신에 다음 함수를 해당 생성기에 적용해야합니다.

def mygen(): 
     i, j = 0, 3 
     return (k for k in range(i, j)) 

나 : 명확하게하려면 함수 정의에 해당

mygen = lambda :(k for k in range(0, 3)) 

그래서 당신은 다음과 같이 사용합니다 :

gen1 = mygen() 
    gen2 = mygen() 
    next(gen1) // returns 0 
    next(gen1) // returns 1 
    list(gen1) // returns [2] 
    list(gen2) // returns [0, 1, 2]