AI資格ドリル
資格を選ぶ↓

用語比較

イテレータとジェネレータの違い|クラスで書くか、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冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

yieldを使うと何が自動になるのか分からない人

__iter__()と__next__()、呼び出しの間の状態の保存、終了時のStopIterationが自動になります。チュートリアル9.9がこの3点を挙げています。

02

forループの裏で何が起きているか知りたい人

チュートリアル9.8は、for文が裏でiter()を呼び、要素を1つずつ取り出す__next__()を持つイテレータを得ると説明しています。要素がなくなるとStopIterationが送出され、forループが終わります。

03

ジェネレータ式とジェネレータの関係を整理したい人

ジェネレータ式は、リスト内包表記の角括弧を丸括弧に替えた短い書き方です。ジェネレータを関数として定義するより用途は限られますが、短く書けます。

具体例で使い分ける

例 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. 1

    自分で書いているものを見る

    classと__next__()があればクラスによるイテレータ、defの中にyieldがあればジェネレータです。

  2. 2

    自動になる部分を確かめる

    ジェネレータでは、__iter__()と__next__()、状態の保存、終了時のStopIterationが自動です。

  3. 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つのものを言える
  • ジェネレータ式が丸括弧で書かれることを説明できる

同じ資格で次に知りたいこと

よくある質問

Qイテレータとは?

A

for文の裏でiter()が返す、要素を1つずつ取り出す__next__()メソッドを持つオブジェクトです。要素がなくなるとStopIterationが送出されます。

Qジェネレータとは?

A

イテレータを作成するための簡潔で強力なツールです。通常の関数のように書き、データを返すときにyield文を使います。

Qイテレータとジェネレータの違いは?

A

書き方です。クラスで書くイテレータは__iter__()と__next__()を自分で定義し、ジェネレータはそれらが自動で作成されます。

QPython3基礎試験の範囲?

A

公式の出題範囲は公式チュートリアルの章単位で、第9章のクラスと、9.8のイテレータ、9.9のジェネレータを含みます。出題の形式は受験前に公式の案内で確認してください。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)