イテレータ
イテレータとは?
- データの流れを表現するオブジェクト
- 要素を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
リストでは、イテレーターでは無いためTypeErrorがはかれます。
イテレータオブジェクトは使用済みの同じものを返す
(list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。
https://docs.python.org/ja/3.10/glossary.html#term-iterator
これだけでは意味が分かりませんでした。
実際にコードにしてみます
[リストの場合] 2箇所でforループをする
コンテナオブジェクトは、自身を 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度同じオブジェクトのループが実行されて、出力もされます
[イテレータの場合] 2箇所でforループをする
これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。
fruits = ["apple", "orange", "grape"]
iterator = iter(fruits)
# 1
for i in iterator:
print(i)
# 2
for i in iterator:
print(i)
apple
orange
grape
1
のfor文の出力のみがされます。
iteratorオブジェクトは使用済みのため、2
では空のコンテナが返されます
どこで使う?
どんなものかはなんとなく分かったが、そもそもの用途が分からない
イテレータの機能として、操作のステップごとに、順に要素を取り出せる事が挙げられます。
これを利用できる例としては、、、
- テキストファイルを開いて、1行ごとに読み取り、表示
- 1行目には、hogehogeの処理をして、表示
- 2行目には、hugahugaの処理をして、表示
最後に
for文があるのでイテレータは滅多に使わないみたいですが。。
こんなものがあるのかと知っておくだけでも良いかもしれないですね