イテレータ
イテレータとは?
- データの流れを表現するオブジェクト
- 要素を1つずつ取り出せるオブジェクト
-
__iter__()
メソッドから取り出されたオブジェクトがイテレータオブジェクト - データがなくなると、StopIteration 例外を送出する
-
イテレータオブジェクトを作ってみる
fruits = ["apple", "orange", "grape"]
iterator = iter(fruits)
print(iterator) # <list_iterator object at 0x10fd7bf70>
for i in iterator:
print(i)
# apple
# orange
# grape
リストと同じようにfor文でループすることが可能です
ではリストとの違いは?
次の要素を調べる
組み込み関数next
を使用することで次の要素を調べることができる
この機能はリストにはできないが、イテレータオブジェクトだからこそ使用できます
イテレータの場合
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
apple
orange
grape
Traceback (most recent call last):
File "/Users/ShoyaBaba/application/practice/python-practice/sample2.py", line 9, in <module>
print(next(iterator))
StopIteration
grape
の次の要素は存在しないのでStopIteration
例外が送出されます
リストの場合
print(next(fruits))
Traceback (most recent call last):
File "/Users/ShoyaBaba/application/practice/python-practice/sample2.py", line 6, in <module>
print(next(fruits))
TypeError: 'list' object is not an iterator
イテレータオブジェクトは使用済みの同じものを返す
(list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。
https://docs.python.org/ja/3.10/glossary.html#term-iterator
公式にもありますが、コレだけでは意味が分かりませんでした。
実際にコードにすることで意味が分かりました
同じ処理中でリストの繰り返しをする
コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。
fruits = ["apple", "orange", "grape"]
for f in fruits:
print(f)
for f in fruits:
print(f)
apple
orange
grape
apple
orange
grape
この結果は容易に想像がつきます。
for文で2度同じオブジェクトをループが実行されて出力もされます
同じ処理中でイテレータの繰り返しをする
これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。
fruits = ["apple", "orange", "grape"]
iterator = iter(fruits)
for i in iterator:
print(i)
for i in iterator:
print(i)
apple
orange
grape
処理中で、一度使用したため空のコンテナが返されます
そのため、上のfor文での出力のみがされます
どこで使う?
どんなものかはなんとなく分かったが、そもそもの用途が分からない
イテレータの機能として、
- 操作のステップごとに、順に要素を取り出せる
がある。
これを利用して書くようできる事例としては、、、
例として
- テキストファイルを開いて、1行ごとに読み取り、表示
- 1行目には、hogehogeの処理をして、表示
- 2行目には、〇〇の処理をして、表示
for文があるのでイテレータは滅多に使わない見たいですが。笑
こんなものがある程度に知っておくといいかもしれないですね