イテレータ

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")

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください