다음에 '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()
설명서를 참조하십시오 .
'IT박스' 카테고리의 다른 글
감정 분석을위한 훈련 데이터 (0) | 2020.12.31 |
---|---|
MySQL의 빈 IN 절 매개 변수 목록 (0) | 2020.12.31 |
GSON-문자열에서 JSON 값 가져 오기 (0) | 2020.12.31 |
80 이외의 포트에서 WebSocket을 사용해야합니까? (0) | 2020.12.31 |
Google API 키를 안전하게 사용하는 방법 (0) | 2020.12.31 |