同様の問題については、多くの良い質問があります。ジェネレータへの複数の「送信」コールでPythonはどのように機能しますか?
python generator "send" function purpose?
What does the "yield" keyword do?
バック "送信" の定義に取得することができます:
は、実行を再開し、ジェネレータ関数に値を「送信します」。 value引数は、現在のyield式の結果になります。 send()メソッドは、ジェネレータによって生成された次の値を返します。 は、ジェネレータが別の 値を生成せずに終了した場合にStopIterationを発生させます。センド()が発電を開始するために呼び出されると 値
を受ける可能性がしかし、私は、私は重要な何かをしないのです感じることは降伏式がありませんので、それは、引数としてなしで 呼び出さなければなりません。
def multiplier():
while True:
m = yield # Line #3
print('m = ' + str(m)) # Line #4
yield str(m * 2) # Line #5
yield str(m * 3) # Line #6
#------------------------
it = multiplier()
print('it.send(None): ')
print(str(it.send(None)))
print('--------------')
print('it.send(10): ')
print(it.send(10))
print('--------------')
print('it.send(100): ')
print(it.send(100))
print('--------------')
そして、ここでは出力です::
it.send(None):
None
--------------
it.send(10):
m = 10
20
--------------
it.send(100):
30
--------------
質問:
-
ここだけのジェネレータを初期化する
#5行目で
it.send(10)
を使用した場合はどうなりますか? の定義に従うと、ジェネレータの実行が再開されます。ジェネレータ は入力値として10
を受け入れ、現在のyield expression
で使用します。私の例ではyield str(m * 2)
ですが、それではm
が10
に設定されています。いつそれは起こったの。の参照番号がm
とyield
の3行目のためですか?#6
it.send(10)
の行には何が起こりますか?出力はまだ30
ですか? 私の以前の質問の参考文献は を一度しか扱っていないことを意味しますか?
None
値を持つ最初のものを含む3つの
send
呼び出し、と私の例です。
注: 私は私の例ビットを変更して、ライン#5、#6、その後print(it.send(10))
後next(it)
を使用する間のラインm = yield
を追加した場合 - その場合には出力が意味をなすために開始します。 20と300
は、あなたのコード内の一つだけ' yield'表現があります。値を送るとしても、 'm'は' while'ループの次の反復まで再割り当てされません。 – vaultah
@vaultahそれはいつ設定されますか? 1回目または2回目の 'send'コールの後に?最初の 'send'は' yield'-sです。もう1つは 'yield'値を変更/設定し、それを' m'に割り当てて、2回目の "yield"呼び出し後に停止しますか? – Axalix
@Axalix最初の 'send'の前にジェネレータの何も実行されませんでした。最初に 'send'を呼び出すと、' m = yield'の 'yield'が入力されるまでジェネレータが実行されます。 2回目の 'send'では、' yield'が 'send'のパラメータで返され、' yield str(m * 2) 'が入力されるまで実行が続けられます。 –