カテゴリ: Python 更新日: 2026/03/06

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

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

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

生徒

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

先生

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

生徒

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

先生

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

1. ジェネレーターとは?初心者に優しい基礎知識

1. ジェネレーターとは?初心者に優しい基礎知識
1. ジェネレーターとは?初心者に優しい基礎知識

Pythonのジェネレーター(Generator)とは、一言でいうと「必要なときに、必要な分だけデータを作って渡してくれる仕組み」のことです。プログラミング初心者の方には、「魔法の注文窓口」をイメージすると分かりやすいでしょう。

通常の関数はreturnを使って一度にすべての結果を返して終了しますが、ジェネレーターはyield(イールド)というキーワードを使います。これにより、値を一つ返した後も関数の状態を「一時停止」して保存しておき、次に呼ばれたときに「その続きから」処理を再開できるのが最大の特徴です。

ここがポイント!
  • メモリの節約: 100万個のデータを一度に作るとメモリがいっぱいになりますが、ジェネレーターなら「今使う1個」だけを作るので、パソコンに負担をかけません。
  • 処理の効率化: 巨大なテキストファイルの中身を一行ずつ確認するような、重たい処理をスムーズに行えます。

まずは、一番シンプルな仕組みをコードで見てみましょう。リストを作らずに、呼び出すたびに挨拶を返す例です。


def greeting_generator():
    print("--- 1回目の呼び出し ---")
    yield "こんにちは!"
    
    print("--- 2回目の呼び出し ---")
    yield "さようなら!"

# ジェネレーターオブジェクトを作成
gen = greeting_generator()

# 1つ目の値を取り出す
print(next(gen))
# 2つ目の値を取り出す
print(next(gen))

このプログラムを実行すると、1つ目のyieldで処理が止まり、次にnext()で呼ばれるまで2回目のプリント文は実行されません。このように「実行を一時停止できる」という性質が、Pythonでの効率的なデータ処理を支えています。

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

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

Pythonのyield(イールド)は、一言で言うと「関数の処理を一時停止して、値を1つずつ返す」ための仕組みです。一般的な関数はreturnで処理を終了してしまいますが、ジェネレーターを使えば、必要な分だけデータを取り出す効率的なプログラムが書けます。

まずは、プログラミングが初めての方でも分かりやすい「数字を順番に数える」シンプルなコードを見てみましょう。


def count_to_three():
    print("1つ目を取り出すよ!")
    yield 1
    print("2つ目を取り出すよ!")
    yield 2
    print("最後、3つ目を取り出すよ!")
    yield 3

# ジェネレーターを動かしてみる
for num in count_to_three():
    print(f"受け取った値: {num}")

1つ目を取り出すよ!
受け取った値: 1
2つ目を取り出すよ!
受け取った値: 2
最後、3つ目を取り出すよ!
受け取った値: 3

このコードの最大の特徴は、yieldに到達した時点で関数の実行が「一時停止」している点です。for文が次の値を求めたとき、関数は前回の続きから再開されます。

一度にすべてのデータをメモリに読み込まないため、例えば「100万個のデータを1つずつ処理したい」といった場面で、パソコンのメモリを節約しながら高速に動作させることができる非常に強力な機能です。

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
Python
Pythonの定数を定義する方法!慣習とモジュールを活用した書き方
New2
Python
Pythonのカプセル化とは?private変数とプロパティの活用方法をやさしく解説
New3
Python
Pythonの継承とは?親クラス・子クラスの関係とメソッドオーバーライドをやさしく解説
New4
Python
Pythonのインスタンス変数とクラス変数の違い!selfの使い方を初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonのfinally文を徹底解説!例外発生時でも実行される処理の書き方と使い方
No.2
Java&Spring記事人気No2
PHP
PHP の MySQL にデータを挿入する方法(INSERT 文の実行)を完全解説!初心者向けガイド
No.3
Java&Spring記事人気No3
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
No.4
Java&Spring記事人気No4
PHP
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.5
Java&Spring記事人気No5
PHP
PHPの可変長引数(...$args)の使い方を完全ガイド!初心者でもわかる基本と活用方法
No.6
Java&Spring記事人気No6
PHP
PHP の MySQL 接続の基本(mysqli, PDO)を完全解説!初心者向けガイド
No.7
Java&Spring記事人気No7
Python
Pythonでエラーメッセージを取得する方法を完全解説!初心者でもわかるExceptionオブジェクト
No.8
Java&Spring記事人気No8
Python
Pythonで経過時間を測る方法をやさしく解説!初心者向けtime.perf_counterとtime.sleepの使い方