LoginSignup
0
1

Pythonのiteratorについて

Posted at

Pythonのiteratorとは

  • iteratorとは、可算量のvalueからなるオブジェクトです。
  • Pythonではiteratoriterator protcolを実装したオブジェクトであり、 __iter__()__next__()メソッドからなります。
  • List, Tuple, Dict, Setなどはいずれもiterableなコンテナであるため、iter, nextメソッドを持ちます。(明示していないだけでメソッドを含む)

class Line:
    __start: Point
    __end: Point
    __next: Point
    __direction: Direction
    ...
    def __iter__(self) -> Iterator[Point]:
        self.__next = self.__start
        return self

    def __next__(self) -> Point:
        if self.__next == self.__end:
            raise StopIteration
        current = self.__next
        self.__next = Point(
            self.__next.x + self.__direction.x, self.__next.y + self.__direction.y
        )
        return current

  • 上記例のように、iterationを止めるには StopIterationを使用します。

なぜiteratorを使うのか

ここでは、なぜ、どのようなケースであればListなどのiterableなobjectではなく, iteratorを自分で定義するのか、を考えていきたいと思います。(考察のため、違う、他にもある、などのフィードバックは宝物として受け取ります。コメントいただけると幸いです。)

  1. 対象objectが単純なvalueではない
    上記の例のように対象objectが単純なintなどではなく、classだが、iterableに操作したい場合、明示的に定義するのかと思います。
  2. 対象となるobjectのサイズが呼び出されるタイミングでは決定していない
    上記例ですと、Pointtuple(int, int) のため、Listtupleを組み合わせて表現することも可能に見えますが、実はこのコードでは他の制約によって(ここでは盤面のサイズ)Listの長さが変わります。Listを使って表現する場合は制約によって決定したサイズのListを渡す必要がありますが、上記コードではiteratorの終了条件を自分で決定できるため、より柔軟なコードを書くことが可能になります。
  3. 見やすさ
    Listtupleといったデータコンテナは、それ自体どのようなデータを含んでいるのか、なんのためのデータなのかが中身を見ないとわからないですが、classでは何を扱っているのか、が一目でわかるという明確なメリットがあります。
0
1
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
1