2016-08-23 1 views
0

이 문제를 설명하기 위해 우리는이 간단한 발전기 있다고 가정발전기가 값이 떨어지면 무슨 일이 발생합니까?

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)이 동일해야합니다. 맞습니까?

+0

당신은 납입 5

iterator = iter(collection) while True: try: x = next(iterator) # do something except StopIteration as e: break 

은 동등하다 '맞지? – jwodder

+0

두 번째 경우에는 yes입니다. 당신이 무엇을 건져도 5보다 크면 1..4를 돌려 줄 것입니다. 생성기가 값을 다 쓰면 호출자에게 데이터가 없음을 알리는 'StopIteration' 예외가 발생합니다. –

답변

1

매우 신비로운 것은 아닙니다. 생산자가 산출 할 가치가 없어지면 StopIteration 예외가 발생합니다. for-loop가 파이썬에서 어떻게 작동하는지 이해할 필요가 있습니다. 본질적으로, 다음 코드와 동일합니다 :

for x in collection: 
    # do something 
+0

차가움. 나는 for 루프가 중단을 위해'StopIteration'을 사용했다는 것을 몰랐습니다. 감사. – Newb

+0

@Newb 속지 마십시오. 그러나 이것은 단지 파이썬과 같습니다. 후드의 경우 CPython에서 훨씬 더 최적의 C 구현입니다. –

관련 문제