イテレータとはなんですか ― Python勉強中 10

最近サボり気味だったけれどちょっとずつ再開。
イテレータについてまとめてみる。


まず、みんpyにはこう書いてある。

複数の要素を持ったデータの要素を順番に取り出すとき、より汎用的な手法を提供するのがイテレータです。

ようするに、色んなデータ型で使える「データを順番に取り出す方法」を提供してくれるらしい。


色んなデータ型で使えるのでルールはいたってシンプル。

  • 次の要素を取り出す
  • 要素が終わったかどうかを判別する


以上2つだけ。

>>> for t in (1,2,3):
...     print(t)
... 
1
2
3
>>> for l in [1,2,3]:
...     print(l)
... 
1
2
3
>>> for d in {1:'a',2:'b',3:'c'}:
...     print(d)
... 
1
2
3

これまで見てきたfor文も、タプルやリストや辞書のデータ型を裏でイテレータオブジェクトへ変換しているので、自動的に順番に取り出す事ができているということみたいです。


Pythonでは、イテレータオブジェクトへ変換する関数として iter() が用意されています。また、次の要素を取り出す処理を next() メソッドでおこない、要素がなくなると StopIteration という例外が発生します。

>>> i = iter([1,2,3])
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list_iterator' object has no attribute 'next'

あ、あれっ!?
ん…あー、Python3 では next() ではなく __next__() のようです。

>>> s = iter('string')
>>> s.__next__()
's'
>>> s.__next__()
't'
>>> s.__next__()
'r'
>>> s.__next__()
'i'
>>> s.__next__()
'n'
>>> s.__next__()
'g'
>>> s.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

これでよし。