이 문제를 설명하기 위해 우리는이 간단한 발전기 있다고 가정발전기가 값이 떨어지면 무슨 일이 발생합니까?
def firstn(n):
num = 0
while num < n:
yield num
num += 1
for i in firstn(10):
print i
이 9까지 숫자 0을 인쇄하지만 것을 우리는있는 경우 :
def firstn(n):
num = 0
while num < 5 < n:
yield num
num += 1
for i in firstn(10):
print i
(변경은 while
에 문 다음. 0부터 4까지의 숫자 만 인쇄합니다. num >= 5
일단 생성자가 더 이상 값을 산출하지 않습니다. 내가 코드를 단계별로 PythonTutor을 사용하고, 나는 아래 해요 인상은 while
문이 더 이상 True
되면, 함수가 암시 적으로 None
을 반환하지 않는다는 것이다 :
내가 대해 궁금하면 후드 아래에가는 것입니다 for
루프가 어떻게 든 감지하고, 또한 끊어집니다. 나는이 더 밀접하게 검사 할 next
내장을 사용 : 내 이론을 지원
>>> def firstn(n):
... num = 0
... while num < 5 < n:
... yield num
... num += 1
...
>>>
>>> mygen = firstn(100)
>>> next(mygen)
0
>>> next(mygen)
1
>>> next(mygen)
2
>>> next(mygen)
3
>>> next(mygen)
4
>>> next(mygen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
합니다. 내 큰 질문 : StopIteration
어떻게 작동합니까, 그리고 이것은 큰 값을 가진 생성자를 호출하는 것이 가장 작은 종료 값으로 호출하는 것과 동일하다는 것을 의미합니까? 이 예에서는 for i in firstn(5)
과 for i in firstn(9999999999999)
이 동일해야합니다. 맞습니까?
당신은 납입 5
은 동등하다 '맞지? – jwodder
두 번째 경우에는 yes입니다. 당신이 무엇을 건져도 5보다 크면 1..4를 돌려 줄 것입니다. 생성기가 값을 다 쓰면 호출자에게 데이터가 없음을 알리는 'StopIteration' 예외가 발생합니다. –