イテレーターについて学んでいきましょう。
イテレーターとは、繰り返し取り出すことができる型のことをいいます。
型はPythonを理解する上で非常に重要な考え方です。型について深く理解したい方は、クラスとオブジェクトという記事を参考にしてください。
イテレーターも型の一つ。ただ、既存の型を変化させるイメージ
まずはイテレーターも型の一つであるということを意識しましょう。
ただし、厳密には型ではなく、既存のデータ型を変化させるというのが正しい表現です。
具体的には、ダックタイピングという考え方を理解している必要があります。
詳しくは、ダックタイピングという記事を参考にして下さい。
といっても、これだけではイメージがわかないですので、具体的なコードを見てみましょう。
実際にイテレーター型に変換してみる
データをイテレーター型にするためには、iter()関数を使います。実際にiter()関数を使ってみましょう。
以下のコードでは、まずリストのデータを準備し、そのデータにiter()関数を使います。
コードは以下のようになります。
コードa = [1, 2, 3, 4, 5]
print (dir(a))
print(type(a))
b = iter(a)
print(dir(b))
print(type(b))
アウトプット'__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__','__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__','__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__','__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__','__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__','__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__','append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove','reverse', 'sort'
<class 'list'>
'__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__','__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__','__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__','__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__','__sizeof__', '__str__', '__subclasshook__'
<class 'list_iterator'>
type()関数で確認したところ、aはlist型、bはlist_iterator型という結果を得ることができました。
ここで、bがiterator型ではなく、list_iterator型という表現になっていることに注目して下さい。
これは、list型をベースとして、それにiterator型としての機能を足した、という考え方です。
dir関数で参照できる変数やメソッドを見ると、参照できる関数などに大きな違いがあることが分かるかと思います。
つまり、listという型をベースにしながらも、listと同じようなことはできない。ということです。
for 文でやっていることは、イテレーター型への変換
ここで、一般的な繰り返し文を見てみましょう。
コードa =[1, 2, 3, 4, 5]
for i in a
このfor文では、繰り返しのデータとして、aというリストを使っています。
このaはイテレーター型ではないですが、実行することができます。
では、このようなコードではどうでしょうか。
コードb = iter(a)
for i in b
この場合でも、コードを実行することができます。
つまり、for文においては、繰り返し使う元になるデータが、イテレーター型でなければイテレーター型に変換し、イテレーター型であればそのまま使う。ということになります。
一応、イテレーターとしての機能を持つことができないオブジェクトを使った場合の動きについて確認してみましょう。
コードa = 10
for i in a
print(i)
アウトプットTypeError: 'int' object is not iterable
というエラーが出てしまいました。
整数型をイテレーター型に変換することができないので、エラーが出てしまいました。
イテレーター型とは何なのか?
では、イテレーター型とは一体何なのでしょうか?
具体的な部分に入っていこうと思います。
イテレーターとは、Pythonの定義では__iter__()関数と、__next__()関数を持っているものをイテレーターと呼びます。
そして、iter()関数を実行することによって、iterクラスにあらかじめ実装されている__iter__関数と、__next__関数が使えるようになるのです。
イテレーターのまとめ
(1) iter()関数を使うことによってイテレーターを作ることができる。
(2) for文では、自動的にイテレーターへの変換が行われる。
イテレーターを学んだあとは
関数を使った高度な概念を学ぶ上での入り口であるクロージャについて学んでいきましょう。