Pythonのイテレータは外部イテレータといわれるやつみたい。
iter関数は、イテレート可能オブジェクトをイテレータオブジェクトに変換する。イテレータオブジェクトは次のような性質を持っている。
- nextメソッドの呼び出しに対して「次の要素」を返す
- 返す要素がなかったらStopIteration例外を発生する
リストをイテレータオブジェクトに変換して試してみよう。
>>> i = iter([1,2,3]) >>> i.next() 1 >>> i.next() 2 >>> i.next() 3 >>> i.next() Traceback (most recent call last): File "", line 1, in StopIteration
イテレータオブジェクトiはnextに対して1~3を順に返し、返す要素がなくなった4回目にはStopIterationが発生している。
実際のプログラミングではforと一緒に使うことが多いようだ。
>>> i = iter(['foo','bar','baz']) >>> for item in i: ... print item ... foo bar baz
ファイルオブジェクトもイテレート可能。nextに対して1行ずつ返すイテレータになる。
import sys
filename = sys.argv[1]
file = open(filename, "r")
i = iter(file)
for l in i:
print l.rstrip("\n")
実行結果:
^o^ > type sample.txt Mon Tue Wed Thu Fri Sat Sun ^o^ > python iterator.py sample.txt Mon Tue Wed Thu Fri Sat Sun
実際には、for文では必要なら自動的にイテレータに変換してくれるので、次のようにも書ける:
file = open("sample.txt", "r")
for line in file:
print line.rstrip("\n")