0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】「イテラブル」と「イテレータ」の違いを図と実例で解説

Last updated at Posted at 2025-04-29

Pythonの勉強をしていると、イテラブル(Iterable)イテレータ(Iterator)という言葉が頻繁に出てきます。

しかしこの2つ、名前が似ていて非常に混乱しやすいものです。
この記事では、両者の違いを初心者にも分かるように、実例を交えながらわかりやすく解説します。

イテラブルとイテレータの違い【ざっくりまとめ】

用語 意味 持っているメソッド
イテラブル (Iterable) for文で回せるオブジェクト __iter__() リスト、文字列、辞書など
イテレータ (Iterator) next() で1つずつ値を取り出せるオブジェクト __iter__()__next__() を両方持つ iter(リスト) など

iter() / next() の正体と内部のしくみ

イテラブルとイテレータは、以下のような関数やメソッドで動いています。

1. iter(obj)

  • イテラブル(リストや文字列など)からイテレータを作る関数
  • 実際には obj.__iter__() が呼ばれます

2. next(obj)

  • イテレータから次の要素を取り出す関数
  • 実際には obj.__next__() が呼ばれます

3. iter()

  • イテラブルが持つメソッドで、iter() によって呼ばれる

4. next()

  • イテレータが持つメソッドで、next() によって呼ばれる
  • 要素が尽きたら StopIteration を送出します
名前 分類 説明 誰が使う?
iter(obj) 関数 obj.__iter__() を呼んでイテレータを返す ユーザー(呼び出し側)
next(obj) 関数 obj.__next__() を呼んで値を返す ユーザー
__iter__() 特殊メソッド iter() によって呼び出される オブジェクトの中身(開発者)
__next__() 特殊メソッド next() によって呼び出される オブジェクトの中身(開発者)

イメージで理解する:イテラブルとイテレータの関係図

[10, 20, 30]    イテラブルデータの箱
     iter()
<iterator>      イテレータ1個ずつ取り出すマシン
     next()
10
20
30

実際のコードで違いを確認してみよう

lst = [10, 20, 30]  # イテラブル
it = iter(lst)      # イテレータを作成

print(next(it))  # 10
print(next(it))  # 20
print(next(it))  # 30
print(next(it))  # StopIteration 発生

🔸 補足: next() は要素が尽きると StopIteration という例外を発生させます。
この例外は for 文の内部でも使われており、ループの終了条件として自動的にキャッチされます。

hasattr を使って確認

print(hasattr(lst, '__iter__'))   # True(イテラブル)
print(hasattr(lst, '__next__'))   # False(イテレータではない)

print(hasattr(it, '__iter__'))    # True(イテレータはイテラブルでもある)
print(hasattr(it, '__next__'))    # True(イテレータ)

補足:hasattrとは?

hasattr() は、あるオブジェクトが特定の「属性(メソッドや変数など)」を持っているかどうかを確認する組み込み関数です。
True または False を返します。

    hasattr(オブジェクト, '属性名')

※属性名は 文字列で渡す必要があります

例:イテラブルとイテレータの判定
lst = [1, 2, 3]
it = iter(lst)

print(hasattr(lst, '__iter__'))   # True(繰り返し可能なオブジェクト)
print(hasattr(lst, '__next__'))   # False(nextでは取り出せない)

print(hasattr(it, '__iter__'))    # True(イテレータは自身もイテラブル)
print(hasattr(it, '__next__'))    # True(nextで要素が取り出せる)

このように hasattr() を使えば、対象が「イテラブルか」「イテレータか」を簡単に確認できます。

イテラブル・イテレータの使われ方(用途別)

イテラブルが使われる場面

シーン 説明
for 文での繰り返し処理 for x in リスト: のように使用
組み込み関数の処理対象 list(), sum(), sorted() などに渡せる
メンバー確認 x in イテラブル のような使い方
zip(), enumerate() などで使う 要素を同時に処理・番号付き処理が可能

イテレータが使われる場面

シーン 説明
next() で1個ずつ取り出したいとき 明示的に順番に処理する
for 文の裏側 for文は内部でイテレータを使っている
メモリ効率を重視した処理 巨大データを一気に読み込まない処理に便利
ファイルやストリームの読み取り 一行ずつ処理するなど

まとめ

用語 意味 覚え方
イテラブル for で使えるもの 繰り返せる
イテレータ next() で値を1つずつ返すもの 取り出しマシン
関数/メソッド 内容
iter() イテラブルからイテレータを作る
next() イテレータから1個ずつ要素を取り出す
__iter__() for文で最初に呼ばれる内部メソッド
__next__() next()の中で実際に呼ばれる内部メソッド

ここまで読んでいただきありがとうございます!
私と同じように「イテラブルとイテレータってややこしい…」と思っていた方の助けになれば嬉しいです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?