Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのイテラブルとイテレータの違いをわかりやすく解説


Pythonにおけるイテラブルとは、組み込み関数iter()に渡したときにイテレータを生成できるオブジェクトのことです。あるオブジェクトがイテラブルであるためには、いくつかの条件を満たす必要があります。具体的には、そのクラスのオブジェクトが__len____getitem__という2つのインスタンスメソッドを定義していなければなりません。これらの条件を満たすオブジェクトをiter()に渡すと、イテレータが生成されます。

それでは、以下の例でイテラブルの動きを確認してみましょう。

string = "Tutorialspoint"
for char in string:
    print(char)

出力結果

T
u
t
o
r
i
a
l
s
p
o
i
n
t

このコードでは、指定されたインデックス位置の要素を返す__getitem__(index)メソッドが利用されています。つまり、上記のコードは内部的に次のような手順で動作しています。

  • インデックス0から処理を開始する
  • string.__getitem__(index)を呼び出す
  • IndexErrorが発生したらループを終了する
  • ループ内の処理(ボディ)を実行する
  • インデックスを1増やしてステップ2へ戻る

イテレータとは何か

イテレータは、内部に持つ状態変数によって反復の進行状況を管理するオブジェクトです。ここで重要なのは、反復が最後の要素を超えても状態変数がゼロに戻らないという点です。代わりにStopIteration()例外が発生し、反復の終了を通知します。この仕様により、イテレータから取得できる要素は一度しか反復できません。以下の例で確認しましょう。

my_list = ['itemOne', 'TutorialsPoint']
it = iter(my_list)
for i in it:
    print(i)
for j in it:  # 2回目は何も表示されない
    print(j)
# しかし、元のリストなら
for k in my_list:
    print(k)
for l in my_list:  # 再度反復できる
    print(l)

出力結果

itemOne
TutorialsPoint
itemOne
TutorialsPoint
itemOne
TutorialsPoint

注目すべきは、イテレータを使った2回目のループでは何も出力されない点です。これは、イテレータがすでに使い切られており、即座にStopIterationを発生させるためです。一方、元のリストmy_listはイテラブルなので、forループのたびに新しいイテレータが生成され、何度でも反復できます。

さらに、イテレータに対してiter()を呼び出すと自分自身が返ります。イテレータは現在の状態を記憶しており、この仕組みによってfor文のような反復処理がStopIterationを検知して適切に終了できるのです。

まとめ:イテラブルとイテレータの違い

  • イテラブル: iter()でイテレータを取得できるオブジェクト(リスト・文字列・タプル・辞書など)。何度でも反復可能。
  • イテレータ: 内部状態を持ち、要素を順番に1つずつ返すオブジェクト。使い切り型で、全要素を取り出した後は再利用できない。

両者の関係を一言で表すと、「イテラブルは反復のもとになるデータ、イテレータは実際に反復を実行する仕掛け」と言えます。この違いを理解すれば、Pythonのfor文やジェネレータの挙動がより明確になります。


  1. Pythonのraw_input()とinput()の違いとは?わかりやすく解説

    Python 2では、ユーザーからのキーボード入力を受け取るために「raw_input()」と「input()」という2つの組み込み関数が用意されていました。名前は似ていますが、この2つには動作面で重要な違いがあります。 raw_input()関数の基本的な使い方 raw_input()は、引数として渡した文字列をプロンプト(入力を促すメッセージ)として画面に表示し、ユーザーが入力した内容を取得します。そして、入力されたデータは必ず文字列(str型)として返されるのが特徴です。 name = raw_input(What is your name? ) print Hello, %s. %

  2. Pythonの文字列(str)とバイト文字列(bytes)の違いをわかりやすく解説

    文字列とバイト文字列の基本的な違いPythonにおける文字列(str)は「文字」の並びであり、これは抽象的な概念です。そのため、そのままではディスクに保存することができません。一方、バイト文字列(bytes)は「バイト」の並びであり、実際にディスクへ保存できるデータです。この両者をつなぐのがエンコーディング(符号化方式)です。エンコーディングには非常に多くの種類があり(理論上は無限に存在します)、変換を行う際にはどのエンコーディングが使われているのかを正しく把握しておく必要があります。なぜエンコーディングの指定が重要なのか同じバイト列でも、解釈するエンコーディングが異なれば、まったく別の文字列