カテゴリ: 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でデータベースの接続プールを使う方法を徹底解説!初心者向けPythonデータベース接続プール入門
New2
Python
Pythonの例外チェーンを完全ガイド!初心者でもわかるfrom句を使ったエラーハンドリング
New3
PHP
PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
New4
PHP
PHPのメモリ管理と変数の破棄方法をやさしく解説!初心者でもわかるunsetの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.2
Java&Spring記事人気No2
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.3
Java&Spring記事人気No3
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.4
Java&Spring記事人気No4
PHP
PHPのデバッグ方法を完全ガイド!初心者でもわかるvar_dump・print_r・error_log
No.5
Java&Spring記事人気No5
PHP
PHPの特殊文字とエスケープ処理を完全ガイド!初心者向けにhtmlspecialcharsとhtmlentitiesをやさしく解説
No.6
Java&Spring記事人気No6
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.7
Java&Spring記事人気No7
PHP
PHPのfor, while, do-whileループの使い方を完全ガイド!初心者でもわかる繰り返し処理
No.8
Java&Spring記事人気No8
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム