イテレータとループカウンタ
 2007.01.30

Pythonプログラムにおいて,イテレータをループで回している時にインデックスも同時にカウントしたいときの話. 例えば,1行1レコードからなるデータファイルを処理するプログラムを考える.処理中にエラーが発生したら,データファイルの行番号とともにエラーメッセージを表示したい. 以前はこんな風に書いてました.
i = 0
for line in file('datatifle.dat') :
    try :
       # process line
       .....
    except SomeError :
       print >>sys.stderr, "error - line : %d" % i
    i += 1
ところがenumerate()関数を使うとプログラマがカウンタの管理をしなくても良いのです.
for i, line in enumerate(file('datafile.dat')) :
    try :
       # process line
       .....
    except SomeError :
       print >>sys.stderr, "error - line : %d" % i
enumerate()関数の引数にはファイルオブジェクト以外にもイテレータプロトコルをサポートしたオブジェクトなら何でも使えます. 2007/10/31追記: Pythonに関する記事であることを本文中に書いた
カテゴリー:python&zope