Pythonのイテレータの基本的な使い方

Python にはイテレータと呼ばれる機能があります。今回は Python におけるイテレータの意味と、イテレータを使用した場合とそうでない場合にどのような違いがあるのかを説明します。

イテレータとは

Python におけるイテレータとは、リストなどの複数の要素をもったデータ型に対して、順番にデータを取り出す機能を提供するものです。具体的にリストを例として見てみましょう。

>>> a = [12, 0.38, "abc", "DEF", 1000]
>>> i = iter(a)
>>> next(i)
12
>>> next(i)
0.38
>>> next(i)
'abc'
>>> next(i)
'DEF'
>>> next(i)
1000
>>> next(i)
Traceback (most recent call last):
 File"<stdio>", line 1, in <module>
StopIteration

1行目ではリスト a を定義しています。そして2行目の iter() 関数はリストをイテレータに変換する関数で、変数iにイテレータを代入しています。iter() 関数で変換可能なオブジェクトはリストに限らず、ディクショナリ型など複数の要素をもつデータ型を引数とすることも可能です。

そして3行目以降の next() 関数が、イテレータ i から要素を順に取り出すための関数となります。このため、next() 関数が実行されるたびに、リストの要素が順に表示されていることが確認できます。なお6回目の実行では、次の要素が存在しないのでで「StopIteration」という例外が出力されています。

イテレータの使い方

イテレータの機能は、実はfor文において、リストを引数に使用した場合に内部的に実行されています。

>>> a = [12, 0.38, "abc", "DEF", 1000]
>>> for i in a:
...     print (i)
... 
12
0.38
abc
DEF
1000

ここでは、for 文の各ステップにおいて、リスト a の値が順に変数 i に格納されていきます。

また、イテレータは操作のステップごとに、順に要素を取り出せるという機能があるため、例えばテキストファイルを開いて、1行ごとに読み取り、表示することができます。

>>> for line in open("sample.txt"):
...     print(line)
...
~sample.txtの一行目~
        ・・・
~sample.txtの最終行~

一方、同様の機能は以下の様にも記述できます。

>>> line = open("sample.txt").read()
>>> print(line)
~sample.txtの一行目~
        ・・・
~sample.txtの最終行~

 後者の場合、1行目にてファイルの内容をすべて読み取り、変数 line に代入しています。結果的にはテキストファイルの内容をすべて表示していますが、前者の方法ではファイルを1行ずつ開くため、メモリ消費量が少ない分、動作速度が遅く、後者ではファイルを一括で読み込むため、動作速度は速い分、メモリ消費量が多くなる、という違いがあります。この違いは、容量の大きなファイルを開く際には、メモリ使用量や動作速度などで影響が大きくなるため、注意が必要になるところです。

このため、イテレータの機能は表面的には使用することはなくても、常に念頭に置かなければならないのです。

まとめ

イテレータの機能は、Python の組み込み型をつ買う場合は for文などの陰に隠れて直接使用する機会は少ないかもしれません。しかしながら、多くの場面でイテレータが使用されていることを意識しておくと、より最適化されたプログラムを作ることができるでしょう。


イベント

2017/12/05(火)
Design Thinking Square