イテレータとは?
イテレータとは、イテラブル(繰り返し可能)なオブジェクトから要素を取り出すオブジェクトのことです。
※イテラブル…for文を用いて、繰り返し処理ができるオブジェクトのこと。リストやタプルなどがあげられます。
next関数とiter関数について
next関数は、next(イテレーター) のようにイテレータから要素を一つ取り出して消去することができる関数のこと。最後の要素を取り出し終わり、再度、関数を実行しようとするとstopIterationという例外が発生する。(繰り返し停止の意味)
iter関数とは、指定されたイテラブルに対するイテレーター(iterator)を返す関数のこと。
>>> iterater = iter([3, 10, 7])
# インデックス0から順番に取り出していく
>>> next(iterater)
3
>>> next(iterater)
10
>>> next(iterater)
7
# エラーが発生する
>>> next(iterater)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
イテラブルとイテレータの違い
仮に、for i in some_list と書いたときfor文は、some_listに実装されているiter()を呼び出して、その戻り値を使います。この戻り値をイテレータと呼びます。for文では、inの後にしてされたオブジェクトには、必ずiter()を適応する。
イテレータオブジェクトは、特殊メッソドの「iter()」と「next()」が実装されています。
some_list = iter([0, 1, 2, 3, 4, 5])
print(dir(some_list))
>>>[---省略---'__iter__', ---省略---, '__next__', ---省略---]
対して、listの特殊、メッソドを表示してみます。
some_list = [0, 1, 2, 3, 4, 5]
print(dir(some_list))
# イテレーターを生成できるが、次の要素にアクセスする機能を持ちえない
>>>[---省略--- '__iter__', ---省略---]
つまり、イテレータは、next()を使うことができるので、次の要素にアクセスできるが、イテラブル(list)は、next()を使うことができないので、次の要素にアクセスする機能を持ちえません。