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

用語比較

ジェネレータとリストの違い(メモリと遅延評価)

リストは、すべての要素をあらかじめ作って保持します。ジェネレータは、next()が呼ばれるたびに、中断した処理を再開して次の値を1つ返します。値をその都度作るため、全要素を一度に保持しません。

公式チュートリアル9.10は、ジェネレータ式について、同じ内容を返すリスト内包表記よりメモリに優しいことが多いという利点があると説明しています。一方で、ジェネレータは終了時にStopIterationを送出し、尽きた後は要素を返しません。リストのように何度も読み直すことはできません。

Python 3 エンジニア認定基礎試験の出題範囲(第9章 クラス)には、イテレータとジェネレータが含まれます。このページでは、角括弧と丸括弧の違い、一度しか使えない点、len()が使えない点を整理します。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

リスト

すべての要素を作って保持する。何度でも読み直せ、len()やインデックスで扱える。

ジェネレータ

next()のたびに処理を再開して、値を1つずつ返す。ジェネレータ式は、角括弧ではなく丸括弧で囲む。

違いを表で確認

比較軸リストジェネレータ
値を作るタイミング作ったときに全要素を作るnext()が呼ばれるたびに1つずつ作る
メモリ全要素を保持する同じ内容のリストよりメモリに優しいことが多い(公式チュートリアル9.10)
くり返して読めるか何度でも読める尽きた後は空。2回目のループでは何も出ない
len()使える使えない(TypeError)
書き方(式)[x * x for x in range(5)](x * x for x in range(5))
関数での作り方returnでリストを返すyield文を使う

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

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

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

01

括弧の違いで結果の型が変わると知らない人

角括弧で囲む内包表記はリストを作り、丸括弧で囲むとジェネレータ式になります。結果の型が違います。

02

ジェネレータを2回ループすれば2回とも同じ値が出ると考える人

ジェネレータは1回回すと尽きます。2回目のループでは何も出ません。もう一度使うなら、作り直します。

03

ジェネレータは最初に全部計算されると考える人

ジェネレータは、next()が呼ばれるたびに処理を再開して次の値を返します。最初に全要素は作られません。

具体例で使い分ける

例 1

角括弧と丸括弧

squares_list = [x * x for x in range(5)] と squares_gen = (x * x for x in range(5)) を作り、型を調べます。

  • 角括弧のほうは、type()の結果がlistです。
  • 丸括弧のほうは、type()の結果がgeneratorです。
  • どちらも、取り出される値は0、1、4、9、16です。

結論: 内包表記の括弧が角括弧ならリスト、丸括弧ならジェネレータ式です。

例 2

ジェネレータを2回リストにする

squares_gen = (x * x for x in range(5)) に対して、list(squares_gen) を2回続けて実行します。

  • 1回目は[0, 1, 4, 9, 16]になります。
  • 1回目で値をすべて取り出したので、ジェネレータは尽きています。
  • 2回目は[](空のリスト)になります。

結論: ジェネレータは、尽きた後に値を返しません。リストなら、2回とも同じ結果になります。

例 3

ジェネレータにlen()を使う

len(x for x in range(3)) を実行します。

  • ジェネレータは、全要素をあらかじめ保持していません。
  • 実際に実行すると、TypeError: object of type 'generator' has no len() になります。

結論: ジェネレータにlen()は使えません。長さが必要なら、list()でリストにするか、数えながら回します。

問題文から答えを選ぶ手順

  1. 1

    括弧を見る

    内包表記が角括弧ならリスト、丸括弧ならジェネレータ式です。関数にyieldがあれば、呼び出し結果はジェネレータです。

  2. 2

    何回読むかを見る

    ジェネレータは1回で尽きます。同じジェネレータを2回ループしていれば、2回目は空になります。

  3. 3

    len()や添字を見る

    len()や[0]のようなインデックスは、ジェネレータに使えません。

  4. 4

    メモリの観点を見る

    値を1つずつ使う集計(sumなど)では、ジェネレータ式のほうがメモリに優しいことが多いです。

試験での見分け方

  • 1角括弧の内包表記はリスト、丸括弧の内包表記はジェネレータ式。
  • 2yield文を持つ関数を呼ぶと、ジェネレータが返る。
  • 3ジェネレータは1回回すと尽きる。2回目は空。
  • 4ジェネレータにlen()は使えない。
  • 5ジェネレータ式は、同じ内容のリスト内包表記よりメモリに優しいことが多い。

誤答しやすい選択肢

丸括弧の内包表記がタプルになると思う

修正: 丸括弧で囲んだ内包表記は、タプルではなくジェネレータ式です。

ジェネレータを何度も再利用できると思う

修正: 尽きた後は何も返しません。もう一度使うなら、作り直すか、list()でリストにしておきます。

ジェネレータが最初に全要素を計算すると思う

修正: next()が呼ばれるたびに、中断した処理を再開して値を1つ返します。

メモリに優しいなら、いつでもジェネレータが良いと考える

修正: 何度も読む、長さを使う、インデックスで扱うなら、リストが向きます。

確認問題

Q1(x * x for x in range(5)) の型は何ですか?

答え: generator

角括弧ではなく丸括弧で囲むと、ジェネレータ式になります。

Q2g = (x for x in range(3)) に対して、list(g) を2回続けて実行すると、2回目の結果は?

答え: [](空のリスト)

1回目で値をすべて取り出して尽きるので、2回目は何も出ません。

Q3sum(i * i for i in range(10)) の結果は?

答え: 285

0から9までの2乗の合計が285です。公式チュートリアル9.10の例と同じです。

到達チェック

  • リストとジェネレータが値を作るタイミングの違いを説明できる
  • 角括弧と丸括弧の内包表記で、結果の型が変わることを説明できる
  • ジェネレータが1回で尽きる点とlen()が使えない点を説明できる
  • yield文を持つ関数がジェネレータを返すことを説明できる

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

よくある質問

Qジェネレータとリストの違いは何ですか?

A

リストはすべての要素を作って保持し、ジェネレータはnext()のたびに処理を再開して値を1つずつ返します。公式チュートリアル9.10は、ジェネレータ式は同じ内容のリスト内包表記よりメモリに優しいことが多いと説明しています。

Qジェネレータ式はどう書きますか?

A

リスト内包表記と似た構文で、角括弧ではなく丸括弧で囲みます。例は sum(i * i for i in range(10)) で、結果は285です。

Qジェネレータを2回ループするとどうなりますか?

A

1回目で値を取り出して尽きるので、2回目は何も出ません。もう一度使うなら、ジェネレータを作り直します。

QPython 3 エンジニア認定基礎試験でジェネレータは問われますか?

A

出題範囲の第9章 クラスに、イテレータとジェネレータ(yield、ジェネレータ式)が含まれます。

次に見る比較

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