Python

【Python】ジェネレータとは何か、使い方も含めて解説


プログラミング言語によっては「ジェネレータ」という謎の概念に出会うことがあります。

この記事では、このジェネレータという概念はどのようなものなのか、また、その基本的な使い方(Pythonを使用)について解説しようと思います。

そもそも「ジェネレータ」とは?

まずは簡単にジェネレータとは何かについて説明します。

関数版のイテレータ

ジェネレータとは、関数と結びつくイテレータのことを指します。

ジェネレータは関数の呼び出しから次の呼び出しの間、その関数におけるローカルの変数を保持したまま処理を中断して待機します。

ジェネレータを用いることで、素数などの無限数列の要素を逐次的に取り出すような処理が可能になります。

なお、イテレータが何かわからないという人は以下の記事を参照して下さい。

【Python】謎の概念!イテレータとは何か、使い方も含めて解説

「ジェネレータ」はどうやって使うの?

ここでは、ジェネレータの基本的な使い方について説明します。

基本的な使い方

関数内でyield文を使用すると、ジェネレータを生成する関数になります。

生成したジェネレータをnext()の引数に指定して、逐次的に要素を取り出すことができます。

>>> def generator():  # yield文によって正の整数を返す関数
...     n = 0
...     while True:
...         yield n
...         n += 1

>>> gen = generator()  # 正の整数を返すジェネレータを生成

>>> print(next(gen))
0
>>> print(next(gen))
1
>>> print(next(gen))
2

以上がジェネレータの基本的な使い方です。

使用例

以下にジェネレータによる素数の計算を実装したプログラムを示します。使用する言語はPythonです。

def generate_primes():  # 素数を返す関数
    a = 2
    while True:
        b = 2
        while b < a:
            if a % b == 0:
                break
            b += 1
        if a == b:
            yield a  # 素数を返す
        a += 1

if __name__ == '__main__':

    primes = generate_primes()  # ジェネレータを生成する

    for i in range(5):
        print(next(primes))

このプログラムを実行すると以下の出力結果が得られます。

2
3
5
7
11

上の例で生成した素数の続きを求めたい場合は、再びジェネレータを呼び出すことで今までに行った計算の続きから処理を再開できます。