Python イテラブルなオブジェクトとイテレータ

株式会社リュディアです。今回はイテラブルなオブジェクトイテレータについてまとめてみます。

イテラブル(iterable)とは繰り返し可能なという意味です。Python ではイテラブルなオブジェクトという使い方をします。どのようなオブジェクトなのでしょうか。

標準で用意されている型やオブジェクトでは以下のものがイテラブルなオブジェクトになります。

文字列
リスト
タプル
辞書
集合
rangeオブジェクト

これらを見ると複数個の要素を含んでおり含まれている要素数だけ次々と要素を取り出せそうな感じがわかりますよね。感覚的にはその理解で結構です。

次にイテレータオブジェクトについて考えてみます。一般にイテレータと呼ばれているものですが、今回のまとめでは敢えてイテレータオブジェクトと記載します。イテレータオブジェクトは連続するデータを表すオブジェクトで一度に1つの要素を返すように実装されています。またイテレータオブジェクト固有のメソッドとして __next__() メソッドを持ちます。イテレータオブジェクトは iter() にイテラブルなオブジェクトを渡すことで生成されます。では早速具体例を見てみましょう。

最初はイテレータオブジェクトを作ろうとして失敗した以下の例を見てください。

a = 2
iter_a = iter(a)
print(iter_a)

>> ---------------------------------------------------------------------------
>> TypeError                                 Traceback (most recent call last)
>> <ipython-input-7-95894e7c9540> in <module>
>>       1 a = 2
>> ----> 2 iter_a = iter(a)
>>       3 print(iter_a)
>>
>> TypeError: 'int' object is not iterable

a = 2 で初期化した整数型の変数 a を iter() に渡していますが、'int' object is not iterable というエラーで失敗しています。a は整数型でイテラブルなオブジェクトではないですよね。iter() にはイテラブルなオブジェクトを渡す必要があります。

では次から本格的な例です。

str = 'abcdefg'
print(str)

iter_str = iter(str)
print(iter_str)

>> abcdefg
>> <str_iterator object at 0x0000028207A87040>

str は文字列で、iter_str は iter() で str をイテレータに変換したものです。つまりイテレータオブジェクトです。print(itr_str) はイテレータオブジェクトのオブジェクト ID を表示しています。ではイテレータオブジェクトに特有の __next__() メソッドを使ってイテレータオブジェクトの内部を見てみましょう。次の例を見てください。

str = 'abcdefg'
print(str)

iter_str = iter(str)
print(iter_str)

print(iter_str.__next__()) # print(next(iter_str)) でも同様
print(iter_str.__next__())
print(iter_str.__next__())
print(iter_str.__next__())
print(iter_str.__next__())
print(iter_str.__next__())
print(iter_str.__next__())
print(iter_str.__next__())

>> abcdefg
>> <str_iterator object at 0x0000028207A87C40>
>> a
>> b
>> c
>> d
>> e
>> f
>> g
>> 
>> ---------------------------------------------------------------------------
>> StopIteration                             Traceback (most recent call last)
>> <ipython-input-10-55cf1dc2c42a> in <module>
>>      12 print(next(iter_str))
>>      13 print(next(iter_str))
>> ---> 14 print(next(iter_str))
>> 
>> StopIteration:

イテレータオブジェクト iter_str に対して __next__()を呼び出すと先頭から 1 つずつ要素を返します。ここで重要なのは iter_str に __next__() を実行し返された要素はイテレータオブジェクトから無くなるということです。そのため文字列の個数だけ __next__() を呼び出すと StopIteration というメッセージとともにプログラムが停止します。

今回はイテラブルなオブジェクトイテレータオブジェクトについてまとめました。繰り返し構造を扱う前にしっかりと理解しておくことで理解が深まります。

文中でイテラブルなオブジェクトという単語とイテレータオブジェクトという単語を意識して記載しました。単語が混乱している説明も散見されますので意識して記載した次第です。

では、ごきげんよう。



この記事が気に入ったらサポートをしてみませんか?