21
16

More than 1 year has passed since last update.

【Python】イテレータが何となく分かる様になる

Last updated at Posted at 2023-08-31

イテレータ

イテレータとは?

  • データの流れを表現するオブジェクト
  • 要素を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文があるのでイテレータは滅多に使わないみたいですが。。
こんなものがあるのかと知っておくだけでも良いかもしれないですね

21
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16