Python のイテレータ、ジェネレータ、コルーチンを簡単にまとめる2022年08月07日 04時13分19秒

Python のイテレータ、ジェネレータ、コルーチンを簡単に要約し、違いを述べる。特にイテレータとジェネレータは同じような使い方を出来るので、混同しやすい。混同しても、コードが書けさえすれば、あまり支障は無い。

まずは要約。

  • イテレータは __iter__() 関数と __next__() 関数を実装するクラス。__next__() 関数を使って複数の要素を取り出すのに使う。
  • ジェネレータは yield を用いて、値を複数回返す事が出来る関数。
  • コルーチンはジェネレータを呼び出す毎に追加の値を渡すことが出来る機構。

イテレータは日本語で反復可能オブジェクトと良く言われる。イタレータは集合の各々の要素にアクセスする為の技法だ。

list や set 等のデータ構造体はイテレータを実装している。その為、複数の値を保持し、各々の要素を得ることが出来る。for ループで各々の要素を処理できるクラスはイテレータになる。list や set 等のデータ構造体が主な実装例。

ジェネレータはその使い方から説明した方が分かりやすい。list や set でデータの集合を返す関数を書くことは多いだろう。それを、list や set で一度に全ての値を返すのでは無く、yield で各々の値を返す様に書くとジェネレータになる。

ジェネレータはその名前の通り、値を生成しその都度返すのが元になっている。生成器だ。有効な使い方は、ループの軽減だろう。set や list で一気に全ての値を返すと、その分メモリや計算能力が消費される。一度に全てを返すのではなく、一つずつ返すジェネレータにする事によって、メモリや計算能力の消費が抑えられる。

コルーチンはジェネレータを更に発展させた物。一つずつの要素の呼び出しの時に、send 関数を使って追加の引数を渡す事ができる。集合を返す関数をジェネレータに置き換えてリソースの節約を計った後に、呼び出し毎に追加の引数が必要になったら、ジェネレータをコルーチンに書き換える事になる。