2017-10-31 8 views
3

例外を発生させるタイミングと、単にPython関数でNoneを返す場合のStackoverflowに関する質問は、予期しない動作や戻りに例外を使用する必要があるということですそうでない場合はなし。StopIteration例外を使用して反復の終了を実現する理由

しかし、反復可能なforループはStopIteration例外によって実現されますが、最終的に反復可能なものの "終わり"に到達するのは通常予期しないものではありませんが、next()メソッドによって発生します。なぜfor-loop over iterablesは実装されているのですか?

+1

イテレータ/ジェネレータのループでは、iterableだけではありません。すべてのイテレータは反復可能ですが、その逆は常に真ではありません。 –

答えて

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

関連する問題