イテレータ
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")
