イテレータの仕組みについて次のポイントが分かれば理解できます。
- iter()関数でリストをイテレータ化します。
- next関数でイテレータから要素を取り出します。
- イテレータで取り出す値がない場合には例外を発生します。
イテレータは特に意識しなくてもfor in文などで活用されたいます。次の例で確認できます。
my_list = [1,2,3,4,5] itr = iter(my_list) print(next(itr)) print(next(itr)) print(next(itr)) print(next(itr)) print(next(itr)) print(next(itr))
結果
1
2
3
4
5
—————————————————————————
StopIteration Traceback (most recent call last)
7 print(next(itr))
8 print(next(itr))
—-> 9 print(next(itr))
StopIteration:
for in文と同じようにリストの内容を一つずつ取り出してくれます。そして要素が無くなった段階で「StopIteration」の例外を発生します。
ではイテレータをどのような場合に使用するかというと、それは自前のクラスにイテレータを仕込んで置いて独自のイテレートを行うときに活用します。range()を自作するようなものです。
class Hoge: def __init__(self,max): self._max = max def __iter__(self): self._n = 0 return self def __next__(self): res = self._n if res > self._max:raise StopIteration self._n += 1 return res hoge = Hoge(2) for i in hoge: print(i) hoge = Hoge(3) for i in hoge: print(i)
結果
0
1
2
0
1
2
3