カテゴリ: Python 更新日: 2026/02/01

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を使った基本的なジェネレーター

以下は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
Python
Pythonの変数スコープとは?初心者でもわかるローカル変数とグローバル変数の違い
New2
Python
PythonのNoneとは?NoneTypeの使い方とnullとの違いをわかりやすく解説
New3
Python
Pythonで文字列の長さを取得する方法!len()の基本と応用
New4
PHP
PHP のインストール方法(Windows・Mac・Linux)と開発環境
-
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPでREST APIを作る方法を完全ガイド!初心者でもわかるAPI開発入門
No.2
Java&Spring記事人気No2
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.3
Java&Spring記事人気No3
Python
Pythonでファイルの更新日やサイズを取得する方法!初心者でもわかるos.stat()の使い方
No.4
Java&Spring記事人気No4
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム
No.5
Java&Spring記事人気No5
PHP
初心者向けにPHP でファイルを開く・読み込む・書き込む方法(fopen, fwrite, fread)を解説する記事
No.6
Java&Spring記事人気No6
Python
Pythonのコンストラクタ(__init__)の使い方を解説!初心者でもわかるオブジェクトの初期化
No.7
Java&Spring記事人気No7
PHP
PHP のインストール方法(Windows・Mac・Linux)と開発環境
No.8
Java&Spring記事人気No8
PHP
PHP の可変変数と変数の参照渡しを完全解説!初心者でも理解できる動的変数の使い方
-
-