16章コルーチン
Python本はいろいろありますが、それらの言うことを信じるとすれば、(コルーチンは)説明が不十分で、不明瞭で、明らかに役に立たないPythonの機能のようです。
——David BeazleyPython本の著者
辞書を引くと、動詞のyieldには主として「生成する」と「譲る」という2つの意味が示されています。Pythonのジェネレータで使用されるyield
キーワードには、どちらの意味も当てはまります。yield item
などのステートメントは、next(…)
の呼び出し元が受け取る値を生成します。また、呼び出し元が次の値を取り込む用意ができるまで、ジェネレータの処理を休止して道を譲りもします。この状態はnext()
が再度呼び出されるまで持続され、そのあと呼び出し元はジェネレータから値を取得します。
コルーチンはその本体にyield
キーワードを持った関数にすぎず、構文的にはジェネレータのようなものです。しかし、コルーチンのyield
は通常、datum = yield
のように式の右辺に現れます。また、値を生成することもあれば、しないこともあります。yield
キーワード以降に式がなければ、ジェネレータが生成するのはNone
です。コルーチンは、呼び出し元からデータを受け取ることもあります。コルーチンにデータを送るには、next(…)
ではなく.send(datum)
を用います。そして呼び出し元はたいてい、コルーチンに値を引き渡します。
yield
キーワードを介したデータのやり取りを、まったく行わないこともあります。データがどのように交換されようと、yield
は制御フローデバイスです。それぞれのコルーチンが中央のスケジューラに制御を譲ることで他のコルーチンを動作させる、協調的なマルチタスクの実装に用いられます。 ...
Get Fluent Python ―Pythonicな思考とコーディング手法 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.