Phython

【Python】ジェネレーターの使い方やメリットを簡単に解説!

本記事では、pythonで用いられる文法の一つであるジェネレーターについてその使い方をご紹介していこうと思います。

「ジェネレーターって何?」といったところから、ジェネレータの使い方や使用するメリットまで説明しているのでぜひ最後まで見ていってください。

ちなみに、本ブログでは初心者の方でも理解できるように丁寧に説明しているので、全くの初心者という方も安心してください。

また、pythonをまだインストールしていないといった方は以下の記事を参考にしてインストールしてみましょう。

この記事でわかること

  • ジェネレーターの使い方
  • ジェネレーターを使用するメリット

 ジェネレーターについて

まず初めに、ジェネレーターとは何かについてお話していこうと思います。

また、本記事ではpythonにおけるリストの知識を必要とするため、「リストについてよくわからない」といった方は以下の記事を参考にしてみてください。

ジェネレーターとは?

ジェネレーターとは、リストのような連続データを作成するための関数のようなものです。

ちなみに、ジェネレーターを生成するための基本構文は以下の通りです。

def ジェネレーター名:
    yield ○○
    yield ○○
    yield ○○

defの後ろでジェネレーター名を定義して、○○の部分に連続データの要素を入れていきます。
では、実際にコードを用いて使用している例を見ていきましょう。

ジェネレーターの基本的な使い方

<input>

def sports():
    yield "soccer"
    yield "baseball"
    yield "basketball"


for i in sports():
    print(i)

<output>

soccer
baseball
basketball

上記のコードでは、まず初めに『sports』といったジェネレーターを作成して、その後for文を用いてsports()の要素を一つずつ出力しています。

このように、ジェネレーターを使用するとリストのように要素を順番に出力することが出来ます。

ジェネレーターで要素を一つずつ取り出す

先ほどの例ですと、for文を用いてジェネレーターの要素を一から一気に出力していったのですが、ジェネレーターでは要素を一つずつ取り出すことも可能です。

では、以下のコードを見ていきましょう。

<input>

def sports():
    yield "soccer"
    yield "baseball"
    yield "basketball"


s = sports()
print("**first**")
print(next(s))
print("**second**")
print(next(s))
print("**third**")
print(next(s))

<output>

**first**
soccer
**second**
baseball
**third**
basketball

上記コードでは、作成したジェネレーターを変数sに代入して、関数nextを用いて要素を一つずつ取り出しています。

もちろん、一つ目の要素を取り出してすぐに二つ目の要素を取り出さなければならないといったルールは存在しないため、好きな処理を行ってから次の要素を取り出すことが出来ます。

同じ要素を複数作成

<input>

def practice(num=5):
    for _ in range(num):
        yield "practice!!!"

p = practice()
for _ in range(5):
    print(next(p))

<output>

practice!!!
practice!!!
practice!!!
practice!!!
practice!!!

上記コードのように、for文をうまく使用することで同じ要素を複数持ったジェネレーターを簡単に作成することが出来ます。

上記の例では『practice!!!』という要素を5つ生成して、5つとも出力していますね。

複数ジェネレーターの要素を交互に出力

<input>

def practice(num=5):
    for _ in range(num):
        yield "practice!!!"

def sports():
    yield "soccer"
    yield "baseball"
    yield "basketball"


s = sports()
p = practice()

print(next(s))
print(next(p))
print(next(s))
print(next(p))
print(next(s))
print(next(p))

<output>

soccer
practice!!!
baseball
practice!!!
basketball
practice!!!

このように、複数のジェネレーターを生成して交互にそれぞれの要素を出力することも可能です。

ジェネレーターを使用するメリット

ジェネレーターを使用する上での一番のメリットは、使用したいときに使用したい要素のみを取り出せることです。
例えば以下のコードを見ていきましょう。

def sports():
    for i in range(100000000):
        print(i)
    yield "soccer"
    for i in range(100000000):
        print(i)
    yield "baseball"
    for i in range(100000000):
        print(i)
    yield "basketball"


s = sports()

print(next(s))

このコードでは、ジェネレータの各要素が生成される直前に『for i in range(100000000): print(i)』といったかなり重いプログラムを処理しなくてはなりません。

この時、別に一つ目の要素しか必要としていないのに全部を読みだそうとしてこの重いプログラムを三回も処理するのって効率が悪いですよね。

ジェネレーターを使うと一つずつ必要となった時に取り出せばよいので、この重い処理を三分割することが出来て、パソコンの負担を減らすことが出来ます。

 まとめ

今回は、ジェネレーターの使用方法から使用する際のメリットについてご紹介してきたのですがいかがだったでしょうか。

ジェネレーターは要素を好きな時に順番に呼び出すことが出来るので使用する場面によっては非常に重宝される文法となっています。

本記事が少しでも皆さんのお役に立てれば幸いです。

-Phython
-,