Python ジェネレータ関数

はじめに

みなさんこんにちはALEXです。今回はジェネレータについて解説します。ジェネレータにはジェネレータ式、ジェネレータ関数の二つの考えがありますが、今回はジェネレータ関数についてご説明します。ジェネレータではyieldというキーワードが重要になります。  

ジェネレータとは

ジェネレータは反復可能なオブジェクトで、イテレータの一部です。for文でループ処理を行うことができます。同じイテレータであるリストとの違いは、その都度、値を生成して返す点です。 リストでなく、ジェネレータを用いるメリットはなんでしょう?それはメモリを効率的に使用できることです。たとえば1から百万までの要素があったとしましょう。リストを使って最初からすべての要素を取得すると大量のメモリを消費してしまいします。それに対してジェネレータを使えばその都度必要な分だけ値を生成して、返すことができるので大幅にメモリを節約することができます。  

ジェネレータ関数を作ってみる

実際にジェネレータ関数を作ってみましょう。まずは対比としてジェネレータを使わない構文を作ります。

以下のように表示されます。

 

次に、printをyieldに変えてみます。

呼び出すと以下のように表示されます。week_sampleはジェネレータオブジェクトとなっています。

 

次のようにfor文を追加して、実行すると先ほどと同じように出力が得られます。

  また、ジェネレータは以下のような構文がジェネレータの特徴をよく生かしているものです。

以下のように出力されます。

 

next(<ジェネレータ>)で出力を得ます。最初のnextで最初のMondayが返されます。この時week_sampleは次の呼び出しがあるまでyield ‘Monday’の行で待機します。次のnextでTuesdayが返され、同じように待機します。このようにその都度yieldで値を返すのがジェネレータです。  

まとめ

ジェネレータについて解説しました。ジェネレータはイテレータの一部ですが、リストなどと異なりyieldで都度要素を取り出し、待機します。これを繰り返すことで必要な要素だけ取り出すことができるので、大量のデータを処理するときにメモリを節約しながら実行できるメリットがあります、