0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

イテレータ

イテレータとは?

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

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?