1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonにおけるイテレータ

Posted at

Pythonでは、イテレータはコンテナ(例えばリスト、タプル、辞書、集合、文字列など)内の要素を一度にメモリにロードせずに逐一訪問できるオブジェクトです。イテレータオブジェクトは2つの特殊メソッド、__iter__()__next__()を実装します。__iter__()メソッドはイテレータオブジェクト自身を返し、__next__()メソッドはコンテナ内の次の要素を返します。イテレータに返す要素がなくなった場合、__next__()メソッドはStopIteration例外を発生させてイテレーションの終了を通知します。

イテレータの利点

  1. メモリの節約:イテレータは要素を逐一処理できるため、一度にすべての要素をメモリにロードする必要はありません。
  2. 柔軟性:イテレータは複雑なデータ構造を処理するためにカスタマイズしたり、遅延評価(必要に応じて計算)を実装したりできます。
  3. 簡潔性:イテレータを使用すると、コードをより簡潔で理解しやすくすることができます。

イテレータの作成

イテレータを作成するには、クラスを定義し、__iter__()__next__()メソッドを実装する必要があります。また、collections.abc.Iteratorを基底クラスとして使用することで、イテレータの実装が正しいかどうかを確認できます。

サンプルコード

以下は、指定範囲内の数字をイテレートするカスタムイテレータクラスを作成する簡単な例です。

from collections.abc import Iterator

class MyRange(Iterator):
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            num = self.current
            self.current += 1
            return num
        else:
            raise StopIteration

# カスタムイテレータを使用
my_range = MyRange(1, 5)

for num in my_range:
    print(num)

コードの説明

  1. Iterator基底クラスのインポートcollections.abcモジュールからIterator基底クラスをインポートし、標準のイテレータインタフェースを実装することを確認します。

  2. MyRangeクラスの定義

    • __init__メソッドで開始値start、終了値end、および現在の値currentを初期化します。
    • __iter__メソッドでイテレータオブジェクト自身(この例ではself)を返します。
    • __next__メソッドで現在の値が終了値より小さいかどうかをチェックします。小さい場合、現在の値を返し、現在の値を1増やします。そうでない場合、StopIteration例外を発生させます。
  3. カスタムイテレータの使用

    • 指定した開始値と終了値でMyRangeオブジェクトを作成します。
    • forループでMyRangeオブジェクトをイテレートし、各値を印刷します。

実行結果

1
2
3
4

この例は、指定範囲内の数字をイテレートする簡単なイテレータを作成する方法を示しています。__iter__()__next__()メソッドを実装することで、より複雑なデータ構造を処理するための独自のイテレータクラスを作成したり、特定のイテレーションロジックを実装したりできます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?