用語比較
イテレータとジェネレータの違い|クラスで書くか、yieldで書くか(Python3基礎)
イテレータとジェネレータは、別々の仕組みではありません。ジェネレータは、イテレータを作るための簡潔な書き方です。イテレータは動き方の約束、ジェネレータはその約束を満たすものをyieldで手早く作る道具と覚えると、2つの関係を整理しやすくなります。
Python公式チュートリアル9.9は、ジェネレータを「イテレータを作成するための簡潔で強力なツール」と説明しています。ジェネレータでできることは、9.8で解説されたクラスを使ったイテレータでも実現できます。違いは、__iter__()と__next__()を自分で書くか、自動で作られるかです。
Python3エンジニア認定基礎試験は、公式チュートリアルの内容を章ごとの出題率で出題する形で、第9章のクラスと、9.8のイテレータ、9.9のジェネレータも範囲です。この記事では、チュートリアルの例を使って、2つの書き方の違いを確認します。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
イテレータ(クラスで書く)
__next__()メソッドを持つオブジェクトを返す__iter__()メソッドを定義する。要素がなくなったら、自分でStopIterationを送出する。
ジェネレータ(yieldで書く)
通常の関数のように書き、データを返すときにyield文を使う。__iter__()と__next__()は自動で作成され、終了時にはStopIterationが自動で送出される。
違いを表で確認
| 比較軸 | イテレータ(クラスで書く) | ジェネレータ(yieldで書く) |
|---|---|---|
| 書き方 | クラスを定義し、__iter__()と__next__()を書く | 通常の関数のように書き、データを返すときにyield文を使う |
| __iter__()と__next__() | 自分で定義する。__next__()を定義したクラスでは、__iter__()は単にselfを返してもよい | 自動で作成される |
| 状態の持ち方 | self.indexやself.dataのようなインスタンス変数に持つ | 呼び出しの間に、ローカル変数と実行状態が自動で保存される |
| 終了のしかた | これ以上要素がないとき、__next__()の中で自分でStopIterationを送出する | 終了時に自動でStopIterationが送出される |
| チュートリアルの例 | シーケンスを後ろからまわるReverseクラス(9.8) | 同じ動きをyieldで書いたreverse()関数(9.9) |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
yieldを使うと何が自動になるのか分からない人
__iter__()と__next__()、呼び出しの間の状態の保存、終了時のStopIterationが自動になります。チュートリアル9.9がこの3点を挙げています。
forループの裏で何が起きているか知りたい人
チュートリアル9.8は、for文が裏でiter()を呼び、要素を1つずつ取り出す__next__()を持つイテレータを得ると説明しています。要素がなくなるとStopIterationが送出され、forループが終わります。
ジェネレータ式とジェネレータの関係を整理したい人
ジェネレータ式は、リスト内包表記の角括弧を丸括弧に替えた短い書き方です。ジェネレータを関数として定義するより用途は限られますが、短く書けます。
具体例で使い分ける
例 1
チュートリアルの Reverse クラスと reverse() 関数
公式チュートリアルは、シーケンスを後ろから順に取り出す動きを、9.8ではクラスで、9.9ではyieldを使った関数で書いています。
- 9.8のReverseクラスは、__init__()でdataとindexを持ち、__iter__()でselfを返します。__next__()ではindexが0になったらStopIterationを送出し、そうでなければindexを1つ減らしてdata[index]を返します。
- 9.9のreverse()関数は、for文の中でyield data[index]と書くだけです。状態を持つためのインスタンス変数も、StopIterationを送出する処理も書きません。
- どちらも、文字列の文字を後ろから順に取り出せます。チュートリアルは、reverse('golf')をforでまわすと f、l、o、g の順になる例を載せています。
結論: 同じ動きでも、クラスで書くと状態の管理と終了の処理を自分で書き、yieldで書くとその部分が自動になります。
問題文から答えを選ぶ手順
- 1
自分で書いているものを見る
classと__next__()があればクラスによるイテレータ、defの中にyieldがあればジェネレータです。
- 2
自動になる部分を確かめる
ジェネレータでは、__iter__()と__next__()、状態の保存、終了時のStopIterationが自動です。
- 3
取り出し方を確かめる
どちらもfor文やnext()で1つずつ取り出せます。要素がなくなるとStopIterationが送出されます。
試験での見分け方
- 1ジェネレータは、イテレータを作成するための簡潔なツール。
- 2クラスで書くイテレータは、__iter__()と__next__()を自分で定義する。
- 3ジェネレータは、__iter__()と__next__()、実行状態の保存、終了時のStopIterationが自動になる。
- 4ジェネレータ式は、リスト内包表記の角括弧を丸括弧に替えた構文で、同じ内容のリスト内包表記よりメモリ使用量を抑えられることが多い。
誤答しやすい選択肢
ジェネレータとイテレータを、まったく別のものだと考える
修正: ジェネレータは、イテレータを作成するためのツールです。ジェネレータでできることは、クラスを使ったイテレータでも実現できます。
ジェネレータにも__next__()を自分で書く必要があると考える
修正: ジェネレータでは、__iter__()メソッドと__next__()メソッドが自動で作成されます。
ジェネレータ式を角括弧で囲む
修正: ジェネレータ式は丸括弧で囲みます。角括弧にするとリスト内包表記になります。
確認問題
Q1イテレータを作成するための簡潔で強力なツールは?
答え: ジェネレータ
チュートリアル9.9が、ジェネレータをそのように説明しています。
Q2ジェネレータで自動になるものを3つ挙げよ。
答え: __iter__()と__next__()の作成、ローカル変数と実行状態の保存、終了時のStopIterationの送出
チュートリアル9.9が、この3点を挙げています。
Q3sum(i * i for i in range(10)) の結果は?
答え: 285
チュートリアル9.10の、ジェネレータ式を使った平方和の例です。
到達チェック
- ジェネレータがイテレータを作成するためのツールだと説明できる
- ジェネレータで自動になる3つのものを言える
- ジェネレータ式が丸括弧で書かれることを説明できる
関連ページで確認する
同じ資格で次に知りたいこと
- json.dump()とjson.dumps()の違い|ファイルに書くか、文字列で受け取るか(Python3基礎)
json.dump()とjson.dumps()の違いを、出力先で整理します。Python公式チュートリアル7.2.2の記述、json.dumps([1, 'simple', 'list'])の結果、json.load()との対応、確認問題つき。
- デフォルト引数に空リストを書く場合とNoneを書く場合の違い|呼び出しをまたいで値が残るか(Python3基礎)
def f(a, L=[]) と def f(a, L=None) の違いを、デフォルト値が評価される回数で整理します。Python公式チュートリアル4.9.1の例で f(1)・f(2)・f(3) の出力が変わる理由と、確認問題つき。
- open()のモード 'w' と 'a' の違い|上書きか、末尾に追加か(Python3基礎)
open()のモード 'w' と 'a' の違いを、既存ファイルの扱いで整理します。Python公式チュートリアル7.2の記述、'r'・'r+'との対応、省略時のモード、確認問題つき。
よくある質問
Qイテレータとは?
for文の裏でiter()が返す、要素を1つずつ取り出す__next__()メソッドを持つオブジェクトです。要素がなくなるとStopIterationが送出されます。
Qジェネレータとは?
イテレータを作成するための簡潔で強力なツールです。通常の関数のように書き、データを返すときにyield文を使います。
Qイテレータとジェネレータの違いは?
書き方です。クラスで書くイテレータは__iter__()と__next__()を自分で定義し、ジェネレータはそれらが自動で作成されます。
QPython3基礎試験の範囲?
公式の出題範囲は公式チュートリアルの章単位で、第9章のクラスと、9.8のイテレータ、9.9のジェネレータを含みます。出題の形式は受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
