回答:
を使用してジェネレータを作成する
g = myfunct()
アイテムが欲しいときはいつでも、
next(g)
(またはg.next()
Python 2.5以下)。
ジェネレーターが終了すると、発生しますStopIteration
。必要に応じてこの例外をキャッチするか、次のdefault
引数を使用できますnext()
。
next(g, default_value)
next(gen, default)
StopIteration
例外を回避するためにも使用できます。たとえばnext(g, None)
、文字列のジェネレーターの場合、反復が終了すると、文字列またはNoneが生成されます。
next(g)
。これは内部的に呼び出さg.__next__()
れますが、通常len(a)
内部的に呼び出されることを気にしないのと同じように、本当に心配する必要はありませんa.__len__()
。
g.next()
あるg.__next__()
py3kに。ビルトインnext(iterator)
はPython 2.6以降で使用されており、すべての新しいPythonコードで使用する必要があります。py<= 2.5をサポートする必要がある場合は、バックインプリメントするのは簡単です。
発電用のひとつの要素を取り出すためbreak
にfor
声明、またはlist(itertools.islice(gen, 1))
あなたの例によれば(文字通り)次のようなことができます:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
「いつでも [一度生成された] ジェネレーターから要素を1つだけ取得したい場合」(50%が元の意図であり、最も一般的な意図だと思います):
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
このようにして、の明示的な使用をgenerator.next()
回避でき、入力の終わりの処理では、(暗号化された)StopIteration
例外処理や追加のデフォルト値の比較は必要ありません。
あなたはエンド・オブ・発電機の場合、何か特別な操作を行いたい場合は、ステートメントセクションのみが必要とされています。else:
for
next()
/ に関する注意.next()
:Python3では、この.next()
メソッドの名前が.__next__()
正当な理由で名前が変更されました:低レベルと見なされました(PEP 3114)。Python 2.6以前は、組み込み関数next()
は存在しませんでした。そして、そのまれな必要性と組み込み名の疑わしいインフレのためnext()
、operator
モジュールに移動することも議論されました(賢明だったでしょう)。
next()
デフォルトなしで使用することは、依然として非常に低レベルの習慣StopIteration
です。通常のアプリケーションコードでは、あからさまにボルトのように不可解なものを公開します。そしてnext()
、デフォルトのセンチネルでの使用-これはnext()
直接入力するための唯一のオプションであるべきですbuiltins
-は制限されており、奇妙な非Pythonicロジック/読み取り可能性に理由を与えます。
結論:next()の使用は非常にまれです- operator
モジュールの関数を使用するようなものです。使用してfor x in iterator
、islice
、list(iterator)
非常に常に可能と-とイテレータを受け入れる他の機能は、シームレスにアプリケーションレベルでイテレータを使用しての自然な方法です。next()
このスレッドの質問が示すように、低レベル、追加の概念、自明ではありません。たとえば、break
in を使用するのfor
は従来通りです。
mySeq.head
?
ジェネレータは、イテレータを生成する関数です。したがって、イテレータインスタンスを取得したら、next()を使用してイテレータから次のアイテムをフェッチします。例として、next()関数を使用for in
して最初のアイテムをフェッチし、後で残りのアイテムを処理するために使用します。
# create new instance of iterator by calling a generator function
items = generator_function()
# fetch and print first item
first = next(items)
print('first item:', first)
# process remaining items:
for item in items:
print('next item:', item)
唯一の方法は、イテレータからリストを取得して、そのリストから必要な要素を取得することだと思います。
l = list(myfunct())
l[4]
myfunct()
あなたは組み込みの機能を使用することができますので、多数の値を生成します)next
次の生成された値を取得します。