レッスン1 / 2問目

『ジェネレーター』

このレッスンではジェネレーターについて学習していきましょう。

ジェネレーターとは

ここではジェネレーターについて解説していきますが、まずジェネレーターの作成方法と使い方を説明した後、ジェネレーターとはどのようなものでどのようなメリットがあるのか解説していきます。

ジェネレーターの作成と使い方

ジェネレーターはdefを用いて、関数を定義して作成します。
これまで作成してきた関数では値を返すために return を使用してきましたが、ジェネレーターでは yield を使用して値を返します。

return は実行されると関数の処理が return の箇所で終了してしまいますが、 yield の場合は、関数の処理は終了しません。
では例を見ていきましょう。

以下のように関数の戻り値をyieldで記述すると、これがジェネレーターとなります。

  1. def a():
  2.     yield 1
  3.     yield 2
  4.     yield 3

これでジェネレーターを作成することができました。関数の return yield に置き換えるだけでジェネレーターとなります。 このジェネレーターは1,2,3を順番に返します。

では、ジェネレーターの使い方について見ていきましょう。

ジェネレーターは以下のようにforループで使用します。

  1. def a():
  2.     yield 1
  3.     yield 2
  4.     yield 3
  5. for i in a():    # ジェネレーターをfor文でループ
  6.     print(i)
1 2 3

1度目のループでは yield 1 、2度目のループでは yield 2 、3度目のループでは yield 3 の値が返されるというイメージです。

このように、for文で使用することがジェネレーターの主な目的です。

ジェネレーターのメリット

上記のfor文を見ると、一見、リストをループした場合と同じように見えます。

ここではリストをループする場合とジェネレーターをループする場合の違いを説明することでジェネレーターのメリットを解説していきます。

まずは以下のリストによるfor文を見ていきましょう。

  1. for i in [1, 2, 3]:
  2.     print(i)
1 2 3

上記のようなリストを用いたfor文で以下のようにリストが常に展開された状態で、そのリストから順番に要素を取得することで繰り返し処理を行っています。

generator

ポイントは1度目のループ~3度目のループまで常に[1, 2, 3]が展開された状態でループされているという点です。


では次は、ジェネレーターを用いた場合を見ていきましょう。下記コードは、先ほど見たジェネレーターの例題と同じコードです。ジェネレーターをループし1、2、3を出力しています。

  1. def a():
  2.     yield 1
  3.     yield 2
  4.     yield 3
  5. for i in a():    # ジェネレーターをfor文でループ
  6.     print(i)
1 2 3

ジェネレーターをループした場合は、1度目のループではジェネレーターより1が返されます。2度目のループではジェネレーターから2が返され、3度目のループではジェネレーターから3が返されます。

generator

リストをループした場合は、常にリストの内容がメモリに展開されていましたが、ジェネレーターを用いたfor文ではループの度にジェネレーターが要素を返すため、メモリ消費の効率がよいのです。

今回の例では[1, 2, 3]のリストをループしましたが、要素数が何百、何千と増えた場合にはジェネレーターのメリットが大きくなります。

メモリという用語が登場しましたが、メモリとは簡単に説明すると「プログラムを実行する際の記憶領域」です。リストでのforループを行う場合はこの記憶領域をリストの要素に占有されてしまいますが、ジェネレーターの場合、ループごとに要素が返されるため記憶領域を占有しません。

つまり、ジェネレーターはリソースを効率的に使うことができるということです。


まとめ

ではこのレッスンの内容をまとめます。

  • ジェネレーターはyieldを用いて関数を定義することにより生成することができる
  • ジェネレーターはループごとに要素を返す
  • ジェネレーターを使うことでリソースの効率が良くなる

では、このレッスンは以上となります。演習課題にチャレンジしましょう。

Lesson1

"A", "B", "C"を返すジェネレーターを作成してください。

Lesson2

作成したジェネレーターをfor文で以下のとおり出力してください。

A B C

Last updated:2019/12/21

A
B
C
  1. # 1. ジェネレーターを作成してください
  2. def a():
  3. yield "A"
  4. yield "B"
  5. yield "C"
  6. # 2. 指定した内容を出力してください。
  7. for i in a():
  8. print(i)
main.py
設定
g
n
i
d
a
o
L