ジェネレータ式によって返されるオブジェクトなどのジェネレータは、遅延イテレータです。あなたが求める値を提供するのに必要なだけのコードを実行します。ジェネレータを反復処理しない場合は、値を要求しないので、コードを実行しないため、何も出力されません。
あなたがそれにnext
を呼び出すことで、イテレータから個々の値を要求することができます。
gen = (print(i) for i in range(5))
x = next(gen) # causes 0 to be printed
y = next(gen) # causes 1 to be printed
next
の最初の呼び出しは、発電機からの最初の値を要求し、それはrange
からの最初の値でprint
を呼び出します。 next
への2回目の呼び出しでは、range
の2番目の値が出力されます。 x
とy
の両方にNone
が割り当てられます。これはprint
が返すものであるため、ジェネレータによって生成されるものです。
あなたはfor
ループで発電機を置く(または引数を反復list
のような関数に渡す)、全体の発電機が消費される場合は、ちょうどあなたが回の束、それにnext
を呼び出した場合などです。 next
を手作業で呼び出すと、最終的にStopIteration
という例外が発生します。これは、イテレータがそれ以上の値を返さないことを通知する方法です。
ジェネレータとは異なり、リストの理解は怠惰ではないため、試したリストの理解には同じ動作がありませんでした。すぐにすべてのコードを実行し、取得したすべての値からリストを作成します。あなたのリストの理解はNone
の値で完全なリストを作成します(それはprint
が返すものなので)。そして、リストがいっぱいになるとすべての数字が印刷されます。
コードのバージョンはどちらも非常にPythonicではありません。一般的には、副作用(例えば、print
値など)に対してのみ、ジェネレータ式またはリスト内包を使用しないでください。あなたが得られた値を気にするとき(またはリストに入れて)、それらを使用してください。あなただけの番号の範囲を印刷したい場合は、単に直接範囲にfor
ループを使用し、ループの本体でprint
を呼び出す:
for i in range(5):
print(i)
それは持っていない許容可能なリスト内包またはコードとジェネレータ式です副作用として、計算される値が有用である限り。たとえば、あなたが信頼性の低いネットワーク上のクライアントの束にメッセージを送信したい場合、あなたはこのような何かを見ていくつかのコードを使用する可能性があります:
results = [client.send(message) for client in clients] # client.send may return an error code
for result in results: # process the results after all the messages were sent
if result is not None: # no error means success
print("client.send error:", result) # report failures, but keep going
最初の行にリストの内包は、主に使用されていますその副作用(メッセージを送信する)が返されますが、返された値のリストは有用なものです。何故エラーが発生したのかが分かるからです。
この[質問](https://stackoverflow.com/questions/47789/generator-expressions-vs-list-comprehension)をご覧ください –
@GarbageCollectorご回答いただきありがとうございます。私はこの質問を見て、私はリストとジェネレータの違いを知っていると言わなければなりません。私の場合、リストまたはジェネレータに要素を入れるだけではなく、関数を呼び出すことになります。私は実際に関数を呼び出す最初のものを引き起こすバックグラウンドで起こっていることを知りたい。 –
'print'の代わりに' f'という関数をいくつか実行すると時間がかかります。ジェネレータを使用する理由は、レイジー・アベレージを利用することです。レイジー・アベレージは、必要のない計算を行わないためです。私たちが 'z =(f(i)for i in range(5)') 'を書くとき、私たちはジェネレーターの理解度を設定していますが、実際にはそれが説明する計算は行っていません。遅延評価と、 'def'構文を使って独自のジェネレータをPythonで記述する方法についてもっと研究することをお勧めします。 –