を取られた後にスローされた例外をキャッチしてください、またはlist(itertools.islice(gen, 1))
あなたは次のようにすることができます:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
「を取得するjusからTつの元素[一度生成]次に、発生器Iはをいつでも「(私は50元の意図厥%、および最も一般的な意図を想定):generator.next()
の明示的な使用をすることができる
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
この方法回避され、入力の終了処理では、(暗黙的に)例外処理や余分なデフォルト値の比較は不要です(StopIteration
)。
else:
for
ステートメントセクションは、ジェネレータの終了時に特別な処理をしたい場合にのみ必要です。next()
/.next()
に
注:その考えローレベル(PEP 3114):のpython3で
.next()
方法が良い理由.__next__()
に改名されました。 Python 2.6より前の組み込み関数next()
は存在しませんでした。また、next()
をoperator
モジュール(これは賢明だったでしょう)に移動することについて議論されました。なぜなら、まれな必要性と組み込みの名前の不確かな膨張のためです。
デフォルトなしでnext()
を使用すると、暗黙のうちに通常のアプリケーションコードの青色のボルトのように暗黙のうちに投げ込まれます。 next()
を直接builtins
に入れる唯一のオプションでなければならないデフォルトのセンチネルを使ってnext()
を使用することは限られており、しばしば奇妙な非平凡な論理/読みやすさの理由を与えます。
ボトムライン:operator
モジュールの機能のように、next()を使用するのは非常にまれです。 for x in iterator
,islice
、list(iterator)
などの関数をイテレータをシームレスに受け入れることは、アプリケーションレベルでイテレータを使用する自然な方法です。 next()
は、このスレッドの問題が示すように、低レベルの特別な概念です。例えば、 for
にbreak
を使用することは従来通りです。
出典
2016-02-12 18:48:10
kxr
gの最後の項目が指定された後にg.next()を使用しようとすると、StopIterationが発生します。 – Wilduck
'next(gen、default)'も、 'StopIteration'例外を避けるために使うことができます。たとえば、文字列のジェネレータの 'next(g、None)'は、繰り返しが終了した後に文字列またはNoneを生成します。 Python 3000の – Attila
、next()は__next __()です。 –