カテゴリ: Python 更新日: 2025/09/21

Pythonのジェネレーター(yield)とは?イテレーターの作り方を解説

Pythonのジェネレーター(yield)とは?イテレーターの作り方を解説
Pythonのジェネレーター(yield)とは?イテレーターの作り方を解説

先生と生徒の会話形式で理解しよう

生徒

「Pythonで大量のデータを順番に処理したいときって、どうやればいいんですか?」

先生

「そんなときに便利なのがジェネレーターです。yieldを使えば、データを一度に全部ではなく、必要な分だけ順番に取り出せます。」

生徒

「イテレーターって聞いたことがありますが、それと関係あるんですか?」

先生

「はい、ジェネレーターはイテレーターを作るための仕組みです。では実際の使い方を見ていきましょう。」

-

1. ジェネレーターとは?

1. ジェネレーターとは?
1. ジェネレーターとは?

ジェネレーターとは、Pythonで繰り返し処理できるオブジェクト(イテレーター)を簡単に作れる仕組みです。returnの代わりにyieldを使うことで、値を返したあと関数の実行状態を保持し、次回呼び出し時に続きから処理を再開します。

例えば、大きなファイルを行ごとに読み込む処理や、無限に続く数列を扱う処理に向いています。

2. yieldを使った基本的なジェネレーター

2. yieldを使った基本的なジェネレーター
2. yieldを使った基本的なジェネレーター

以下は1から3までの数字を順番に返すジェネレーターの例です。


def number_generator():
    yield 1
    yield 2
    yield 3

for num in number_generator():
    print(num)

1
2
3

yieldを使うことで、関数が一度に全ての値を返すのではなく、呼び出しごとに次の値を返します。

3. 大量データ処理でのメリット

3. 大量データ処理でのメリット
3. 大量データ処理でのメリット

通常のリストは全データをメモリに保持しますが、ジェネレーターは必要な分だけ生成するため、メモリ効率が良いです。


def read_lines():
    for i in range(1, 6):
        yield f"{i}行目のデータ"

for line in read_lines():
    print(line)

1行目のデータ
2行目のデータ
3行目のデータ
4行目のデータ
5行目のデータ

この方法なら、大きなファイルでも一行ずつ処理でき、メモリ消費を最小限に抑えられます。

4. next()関数で手動制御

4. next()関数で手動制御
4. next()関数で手動制御

ジェネレーターはnext()関数を使って手動で値を取り出せます。


gen = number_generator()

print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

1
2
3

最後の要素を取り出した後でさらにnext()を呼び出すと、StopIteration例外が発生します。

-

5. 無限ジェネレーターの例

5. 無限ジェネレーターの例
5. 無限ジェネレーターの例

ジェネレーターは条件を付けなければ無限に値を生成できます。


def infinite_counter():
    num = 1
    while True:
        yield num
        num += 1

counter = infinite_counter()
for _ in range(5):
    print(next(counter))

1
2
3
4
5

この例では数が増え続けるため、使う側で終了条件を決める必要があります。

6. イテレーターとの関係

6. イテレーターとの関係
6. イテレーターとの関係

ジェネレーターは__iter__()__next__()メソッドを自動で持つため、イテレーターの作成を簡単にする仕組みです。

通常のクラスでイテレーターを作ると複雑ですが、ジェネレーターならyieldを使うだけで簡潔に書けます。

7. 実用例:偶数だけを生成するジェネレーター

7. 実用例:偶数だけを生成するジェネレーター
7. 実用例:偶数だけを生成するジェネレーター

条件を加えることで、必要なデータだけを生成できます。


def even_numbers(limit):
    for n in range(limit + 1):
        if n % 2 == 0:
            yield n

for n in even_numbers(10):
    print(n)

0
2
4
6
8
10

無駄なデータを持たず、必要な値だけを順次生成できるのがジェネレーターの強みです。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
New2
PHP
PHPのスコープとは?グローバル・ローカル・スーパーグローバルを完全解説!
New3
PHP
PHPの演算子をやさしく解説!算術・比較・論理・ビット演算子の使い方
New4
PHP
PHP の変数とは?基本的な使い方とデータ型を徹底解説!
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonで辞書のキー・値・アイテムを取得する方法(keys(), values())
No.2
Java&Spring記事人気No2
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Python
Pythonでエラースタックトレースを表示・取得する方法を徹底解説!初心者向け例外処理入門
No.4
Java&Spring記事人気No4
Python
PythonでMySQLに接続する方法を完全解説!初心者でもわかるpymysqlの基本
No.5
Java&Spring記事人気No5
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.6
Java&Spring記事人気No6
PHP
PHP の日付と時間の取得(date, time, strtotime)を完全解説!初心者でもわかる使い方
No.7
Java&Spring記事人気No7
PHP
PHPで画像ファイルをアップロードする方法を初心者向けに徹底解説!わかりやすい画像処理入門
No.8
Java&Spring記事人気No8
PHP
PHP のデータ型を完全ガイド!初心者でもわかる int, string, float, bool など
-
-