[解決済み】Pythonジェネレータの「send」関数は何のためにあるのか?
質問
Pythonのジェネレータ関数に付随する"send"関数がなぜ存在するのか、どなたか例を教えてください。yield関数は十分理解しています。しかし、send関数は私には分かりにくいです。このメソッドに関するドキュメントは複雑です。
generator.send(value)
実行を再開し、ジェネレータ関数に値を「送信」します。value引数は、現在のyield式の結果になります。send()メソッドは、ジェネレータが生成した次の値を返すか、別の値を生成せずにジェネレータが終了した場合はStopIterationを発生させます。
どういう意味ですか?valueって関数の入力じゃなかったっけ?send()メソッドはジェネレータが生成した次の値を返す」というのは、yield関数の目的そのものでもあるような...。
誰か、yield ではできないことを実現する send を利用したジェネレータの例を教えてください。
どのように解決するのですか?
これは、ちょうど収量したジェネレーターに値を送るために使用します。ここでは、人工的な(役に立たない)説明の例を示します。
>>> def double_inputs():
... while True:
... x = yield
... yield x * 2
...
>>> gen = double_inputs()
>>> next(gen) # run up to the first yield
>>> gen.send(10) # goes into 'x' variable
20
>>> next(gen) # run up to the next yield
>>> gen.send(6) # goes into 'x' again
12
>>> next(gen) # run up to the next yield
>>> gen.send(94.3) # goes into 'x' again
188.5999999999999
だけではできません。
yield
.
なぜこれが便利なのかというと、私が見た中で最も良い使用例のひとつが、Twistedの
@defer.inlineCallbacks
. 本来はこのような関数を書くことができるのです。
@defer.inlineCallbacks
def doStuff():
result = yield takesTwoSeconds()
nextResult = yield takesTenSeconds(result * 10)
defer.returnValue(nextResult / 10)
何が起こるかというと
takesTwoSeconds()
が返されます。
Deferred
これは、後で計算される値を約束するものです。Twistedは、別のスレッドで計算を実行することができます。計算が終わると、それをディファレンシャルに渡し、その値は再び
doStuff()
関数があります。このように
doStuff()
は,あらゆる種類の計算やコールバックなどを行うことができることを除けば,多かれ少なかれ通常の手続き型関数と同じように見えるはずです.この機能を使う前の選択肢としては、以下のようなものがあります。
def doStuff():
returnDeferred = defer.Deferred()
def gotNextResult(nextResult):
returnDeferred.callback(nextResult / 10)
def gotResult(result):
takesTenSeconds(result * 10).addCallback(gotNextResult)
takesTwoSeconds().addCallback(gotResult)
return returnDeferred
もっと複雑で扱いにくいものです。
関連
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み] リストとタプルの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python入門 openを使ったファイルの読み書きの方法
-
任意波形を生成してtxtで保存するためのPython実装
-
Pythonの@decoratorsについてまとめてみました。
-
Python 入出力と高次代入の基礎知識
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない