イテレータ

今回はイテレータについて学習。
まずはイテレータって何なのかというところから。
イテレータは複数の要素を持ったデータから要素を順番に取り出していくときに、
インデックスのような特定の形式のデータだけに利用できる方法を使わないみたい。
代わりに、次の要素を取り出すこと、要素が終わったか判別すること、の2つの処理を
利用するらしい。

pythonイテレータイテレータオブジェクトを基に実装されているらしい。
リストや辞書などの組み込み型のオブジェクトはiter()関数でイテレータオブジェクトに
変換できるみたい。
それでイテレータオブジェクトのnextメソッドで次の要素を取り出す処理ができるらしい。

リストをイテレータオブジェクトに変換して試してみる。

>>> i = iter(range(1,4))   #range関数でつくったリストをイテレータオブジェクトに変換してiに代入
>>> i.next()        #イテレータオブジェクトのnextメソッドを使い順番に要素を取り出す
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()        #要素が無くなった
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

for文によるループ処理では、必要ならイテレータオブジェクトへの変換が自動的に行われているらしい。
なのでイテレータについて意識する必要が全く無いかと言えばそうでもないらしい。
例えばファイルを処理するときにシーケンスを使ったループではループ開始前にファイルの内容を全部
読み込んで、行ごとに分けたシーケンスを用意しなきゃいけない。
でもイテレータを使うと必ずしも要素が全部揃っている必要が無く、実際にループが進むごとに改行の位置まで
ファイルを読み込んで、行を返すことをするらしい。
ファイルのサイズが大きいと、シーケンスを使った処理ではファイルの内容全部をメモリ上に置かなきゃならないし、
ファイルの最初の一部分だけに用があるときも一度ファイル全体を読み込まなきゃならないから余計な時間がかかる。
イテレータを使った処理ではこのような弊害を気にする必要がないわけだ。