こんにちは、ミナトです。
Pythonではジェネレータという機能があり、ジェネレータを使うことで簡単にイテレータを定義できます。
ジェネレータを使うことで処理を一時停止して、途中で結果を返すことができます。
イテレータについてはこちらの記事をご確認ください。

- Pythonのジェネレータの使い方を知りたい
- Pythonでプログラミングを学びたい
ジェネレータの使い方
ジェネレータとは
ジェネレータは簡単にイテレータを定義できる仕組みのことで、関数の中でreturn文の代わりにyield文を使うことで定義できます。
ジェネレータとして動作する関数をジェネレータ関数と呼び、ジェネレータ関数を実行するとジェネレータオブジェクトが返却されます。
ジェネレータの定義
ジェネレータを定義するには、関数を定義する際にreturn文の代わりにyield文を使用します。
以下の例では、g = my_generator()
でジェネレータを作成しています。このときmy_generator()
の処理はまだ実行されず、ジェネレータオブジェクトが返却されます。
最初にnext()
を呼んだタイミングで1が返却され、my_generator()
の処理を一度抜けます。このときジェネレータは今の状態を覚えており、次にnext()
呼ぶと途中から処理が再開されます。
ジェネレータを使うとyield文で処理が一時停止できるので、反復処理の間に別の処理を挟むことができます。
以下の例では途中でprint('処理AAA')
を実行しています。
def my_generator():
yield 1
yield 2
yield 3
yield 4
yield 5
g = my_generator()
print(next(g))
print('処理AAA')
print(next(g))
print('処理BBB')
print(next(g))
# 出力
1
処理AAA
2
処理BBB
3
また、これ以上返却するデータがない状態でnext()
を実行すると「StopIteration」という例外が発生します。
ジェネレータ式
以前の記事で内包表記について解説しました。
ジェネレータも内包表記を利用して簡潔に記述できます。
(式 for 繰り返し変数 in シーケンス (if 条件式))
g = (i**2 for i in range(10))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
## 出力
0
1
4
9
16
まとめ
今回はPythonでのジェネレータの使い方について紹介しました。
ジェネレータの特徴を以下の通りです。
- 簡単にイテレータを定義できる仕組みのこと
- ジェネレータ式が利用できる
- 返却する要素がない場合、「StopIteration」の例外が発生する
最後まで読んでいただき、ありがとうございます。
この記事が「面白いな」、「勉強になったな」という方は、SNSでシェアしていただけると嬉しいです。
ジェネレータは簡単にイテレータを定義できる仕組みやで!