2017-10-31 7 views
3

예외를 발생시키는시기와 단순히 Python 함수에서 None을 반환하는 경우에 대한 Stackoverflow- 질문을 볼 때 나타나는 새로운 그림은 예기치 않은 동작과 반환을 위해 예외를 사용해야한다는 것입니다 그렇지 않으면 없음.StopIteration 예외로 반복의 끝이 실현되는 이유

그러나 iterables의 for-loop는 StopIteration 예외를 통해 실현되며 next() 메서드로 발생합니다. 일반적으로 iterable의 "end"에 도달하는 것은 일반적으로 예상치 못한 일은 아닙니다. 왜 for-loop over iterables가 구현 되는가?

+1

iterators/generators 이상의 루프는 반복 가능하지 않습니다. 모든 반복자는 반복 가능하지만, 그 반대가 항상 사실 인 것은 아닙니다. –

답변

5

전체적인 대답은 반복자/생성기의 끝을 안전하게 나타내는 센티넬 값을 사용할 수 없다는 것입니다. 단순히 None 개체의 목록이 있다고 가정하면 None을 더 이상 감시 가치로 사용할 수 없습니다. 그래서 StopIteration이 사용됩니다 : 센티널 값이 없으면 문제가 발생하지 않습니다.

이 동작을 피하고 next에 기본값을 반환하려면 next(generator, None)을 호출하면됩니다.

+2

더 많은 경우, 'yield from'구문을 사용하는 중첩 된 생성자의 경우 소스 생성기의 고갈을 신호하기 위해 단순히 오류를 전파하는 것이 더 쉽습니다. –

+0

@MosesKoledoye : 'StopIteration'을 사용하기로 결정했을 때 'yield from'이 존재하지 않았습니다. 지옥, 발전기는 당시에는 전혀 존재하지 않았습니다. – user2357112

+0

또한 'yield from'은 'StopIteration'을 전파하지 않습니다. 예외를 잡아 내고 예외의'value'를'yield from' 표현식의 값으로 사용합니다. – user2357112