Python ジェネレーターで順番に取り出す

Pythonではジェネレーターで順番に取り出すことができます。

ジェネレーター」とは生成器という意味で、おもにジェネレーター関数のことを指します。ジェネレータ関数とはシーケンスを作成する関数です。

シーケンスはリストなど他にもありますが、ジェネレーターの特徴としては、作成されたときには要素数が確定していないという点です。

リストは作られた時点で要素数が決まりますが、ジェネレータは決まっていません。これから作られます。呼び出されてはじめて生成されます。だから生成器、ジェネレーターと呼ぶんですね。

ジェネレータは言葉で説明すると難しく感じるのですが、下の例をみてもらうとすぐに意味がわかると思います。

今回は、Pythonのジェネレーターを使って順番に取り出していきます。

Pythonのジェネレーター

ジェネレーター構文

def 関数(str):
    for s in str():
        yield s
# ジェネレーターを呼び出す
ジェネレータ変数 = 関数(文字列):
next(ジェネレータ変数)

Pythonのジェネレータとは戻り値を「yield」で返すジェネレーター関数です。

ジェネレータは「next(変数)」で1つずつ取り出すことができます。

例1. ジェネレータを使って文字を取り出す

def get_str(str):
    for s in str:
        yield s

関数「get_str」がジェネレータ関数です。受け取った文字列「str」を「for ~ in」で1文字ずつとりだし、「yield」で返します。

戻り値を「return」ではなく「yield」で返すので、関数「get_str」はジェネレータ関数となります。

ジェネレータの特徴はここですね。ジェネレータ関数を作った時点では要素数が決まっていません。他から要素を与えられてはじめて確定します。

いわゆる遅延実行というやつです。

gen = get_str('abc')

str = next(gen)
print(str)
#[結果] a

str = next(gen)
print(str)
#[結果] b

str = next(gen)
print(str)
#[結果] c

ジェネレータ関数「get_str」に文字列「abc」を渡して実行しました。

ジェネレータから1つずつ取り出すには「next」を使います。nextするたびに1つずつ文字列を取り出すことができました。

例2. ジェネレータで生成できない

str = next(gen)
print(str)
#[結果] StopIteration

例1でジェネレータ関数「get_str」に文字列をわたして1つずつ取り出しましたが、要素数を超えて「next」して取り出すとどうなるか?

例1のあとに再度「next」すると、エラーになりました。当然ですが、要素数を超えるとエラーとなります。

少しとっつくにくいジェネレータを例を使って解説しました。あまり使用頻度は多くないと思いますが、知っておいて損はないかと。

以上、Pythonでジェネレーターを使って順番に取り出す方法でした。

コメント