ジェネレータについて

6.2 ジェネレータについて

イテレータについてを学習したところで、ジェネレータについて学習していきましょう。

ジェネレーターとは、イテレータを生成するための関数を意味します。ジュネレータの戻り値はイテレータになりますので、戻り値には当然、__iter__メソッドや次の値を参照するための__next__メソッドが含まれます。

6.2.1 ジェネレータの作成方法

ではジェネレータはどのように定義するのでしょうか?
まずジェネレータは、関数(またはメソッド)として利用するため、関数を定義する必要があります。
続いて一般の関数であれば、戻り値を指定する際にreturn文を使用するところ、ジェネレータでは代わりに「yield式」を使用します。
yield式とはジェネレータのための式であり、return文と違い、値を何度でも返すことが可能です。ジェネレータの定義を書式をまとめると以下の通りです。

書式:ジェネレータの定義

yield式とはジェネレータのための式であり、return文と違い、値を何度でも返すことが可能です。ジェネレータは変数に代入することが一般的であり、代入された変数は、yieldで指定した全ての値を含むイテレータとなります。

凡例

    def names():
        yield '佐藤'
        yield '田中'
        yield '鈴木'

    name1 = names()

    next(name1)

    for name in name1:
        print(name)
	

実行結果

	田中
	鈴木
	

関数namesはジェネレータであるため、関数namesを実行すると、namesを代入したname1が「佐藤」、「田中」、「鈴木」を格納したイテレータになります。

図 6.2.1:ジェネレータの生成

name1はイテレータですので「next(name1)」が指定した上で、for文を介してname1の値を一つずつ取り出すと、上記のような実行結果になります。

図 6.2.2: イテレータのループ

6.2.2 イテレータやジェネレータを使う目的

イテレータについて学習してきましたが、どうしてイテレータを必要があるのでしょうか?以下でイテレータを使う目的について解説していきます。

1. データ型の統一

Pythonにはリスト、辞書、集合など配列を扱う上で、様々なデータ型が用意されています。

それぞれ異なるデータ型を併用すると、値を取り出す際に、各データ型に合わせてメソッドを使い分ける必要があるので非常に不便です。
そこでiter関数を用いて各配列のデータ型をイテレータに変換することで、そのような不便さを払しょくすることができるため、イテレータが使われます。

2. 容量の節約

リストなど配列を生成すると、当然、要素の数だけメモリを消費します。少数の要素であれば問題ありませんが、要素の数が膨大になるほどメモリを圧迫することになるので、気を付けなければなりません。
一方、ジェネレータ関数を使うと、各要素を必要なタイミングで生成し、値を返してくれます。全ての値が格納された配列をメモリに格納する必要がありません。
メモリが節約できるため、ジェネレータ関数を介してイテレータが使用されます。

ポイント

  • ジェネレータとはイテレータを生成する関数である。
  • ジェネレータを作成する際には、returnの代わりにyieldを使用する。
  • yieldを使うと、複数の要素の値を何度でも返すことができる。
  • イテレータは、異なるデータ型の配列を統一するために用いれられる
  • ジェネレータはメモリーの節約のために用いられる。

NEXT>> 6.3 本章のまとめ