IT박스

다음에 'StopIteration'을 발생 시키는데 'for'가 정상적인 반환을하는 이유는 무엇입니까?

itboxs 2020. 12. 31. 08:05
반응형

다음에 'StopIteration'을 발생 시키는데 'for'가 정상적인 반환을하는 이유는 무엇입니까?


이 코드 조각에서, 왜 사용하지 않는 for어떤에서 결과를 StopIteration나되는 for루프는 종료 자동으로 모든 예외를 트래핑하고? 어떤 경우에 우리는 왜 외부인을 가지고 있습니까 return? 또는 raise StopIteration원인 : return None?

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)

StopIteration에서 트리거되고 있다고 가정 return None합니다.. 언제 GeneratorExit생성됩니까?

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)

수동으로 수행하는 경우 :

c = countdown(10)
c.close() #generates GeneratorExit??

어떤 경우에 역 추적이 표시되지 않는 이유는 무엇입니까?


for루프를 수신 StopIteration명시 적으로.

for명령문 의 목적은 반복기가 제공하는 시퀀스를 반복하는 것이며 예외는 반복기가 이제 완료되었음을 알리는 데 사용됩니다. for반복되는 객체에 의해 발생하는 다른 예외는 포착하지 않습니다.

이는 StopIteration반복하는 사람에게 더 이상 생성 할 것이 없음을 알리는 정상적인 예상 신호 이기 때문 입니다.

생성기 함수는 특별한 종류의 반복기입니다. StopIteration함수가 완료되면 실제로 발생합니다 (즉, 반환 될 때 발생하므로 예, 발생 return None합니다 StopIteration). 반복자의 요구 사항입니다. 그들은 완료되면 일으켜야 합니다StopIteration . 실제로 a StopIteration가 발생하면 (를 통해 next()또는 반복기 에서 .next()(py 2) 또는 .__next__()(py 3) 메서드를 호출하여) 다른 요소를 가져 오려고하면 항상 다시 발생 해야StopIteration 합니다.

GeneratorExit다른 방향으로 소통하는 것은 예외 입니다. 표현식을 사용 하여 생성기를 명시 적으로 닫고 있으며 yield, Python이 해당 종료를 생성기에 전달하는 방법 GeneratorExit은 해당 함수 내부에서 발생하는 것입니다. 내부에서 예외를 명시 적으로 포착합니다 countdown. 그 목적은 생성자가 닫을 때 필요에 따라 리소스를 정리하도록하는 것입니다.

A GeneratorExit는 호출자에게 전파되지 않습니다. generator.close()설명서를 참조하십시오 .

참조 URL : https://stackoverflow.com/questions/14413969/why-does-next-raise-a-stopiteration-but-for-do-a-normal-return

반응형