イテラブルは、要素のシーケンスを提供するオブジェクトです。リスト、タプル、セット、文字列など、複数の要素を持つデータ型はすべてイテラブルです。イテラブルオブジェクトは、for
ループやリスト内包表記などの反復処理文で直接使用できます。
一方、イテレータはイテラブルを逐次処理するためのオブジェクトです。イテレータは__iter__()
メソッドと__next__()
メソッドを実装しており、__iter__()
メソッドはイテレータ自体を返します。__next__()
メソッドは、次の要素を返し、イテレータが終了した場合にはStopIteration
例外を発生させます。
イテラブルとイテレータの違いは、イテラブルは反復処理に使用されるデータのコレクション自体を表し、イテレータはそのデータコレクションを逐次処理するためのオブジェクトを提供する点にあります。つまり、イテラブルはデータのコンテナであり、イテレータはそのコンテナ内の個々の要素にアクセスする方法を提供します。
以下に、イテレータとイテラブルの使い方とコード例を示します。
# イテラブルの例
my_list = [1, 2, 3, 4, 5]
# forループでイテラブルを処理する
for item in my_list:
print(item)
# イテレータの例
my_iter = iter(my_list)
# イテレータから要素を逐次的に取得する
print(next(my_iter)) # 1
print(next(my_iter)) # 2
print(next(my_iter)) # 3
# イテレータが終了するとStopIteration例外が発生する
print(next(my_iter)) # StopIteration例外が発生する
# イテラブルオブジェクトからイテレータを作成する短縮形
my_iter2 = iter([6, 7, 8, 9, 10])
# イテレータから要素を逐次的に取得する
print(next(my_iter2)) # 6
print(next(my_iter2)) # 7
print(next(my_iter2)) # 8
このように、イテレータとイテラブルはPythonで反復処理を行うための重要な概念です。イテレータはイテラブルから要素を逐次的に取得するためのオブジェクトであり、イテラブルは要素のシーケンスを提供するオブジェクトです。理解することで、効率的で柔軟な反復処理を実現することができます。