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.