ホームページ >バックエンド開発 >Python チュートリアル >Python イテレータについての深い理解: `__iter__` と `__next__` を使用したデータのナビゲーション

Python イテレータについての深い理解: `__iter__` と `__next__` を使用したデータのナビゲーション

Barbara Streisand
Barbara Streisandオリジナル
2024-11-29 09:53:13323ブラウズ

Deep Understanding on Python Iterators: Navigating Data with `__iter__` and `__next__`

イテレータ は、2 つのメソッドを実装するオブジェクトです。

  • __iter__(): イテレータ オブジェクト自体を返します。
  • __next__(): シーケンス内の次の項目を返します。使用可能な項目がなくなると、StopIteration 例外が発生します。

基本的なイテレータの作成:

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

    def __iter__(self):
        return self  # Returns itself as an iterator

    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        self.current += 1
        return self.current - 1

counter = Counter(1, 4)
for number in counter:
    print(number)  # Outputs: 1, 2, 3

このクラスは next() 呼び出しを手動で制御し、最後に到達すると停止します。イテレータは、各要素がオンデマンドで処理されるシーケンスを操作する場合に役立ちます。


2. Python ジェネレーター: 大量のデータを効率的に処理する

ジェネレーター は、イテレーターを作成する簡単な方法です。 yield キーワードを使用する関数で定義すると、yield で関数の実行が一時停止され、next() が呼び出されたときに再開されます。各 yield ステートメントは関数の状態を保存します。つまり、関数は中断したところから再開できます。

基本的なジェネレーターの例:

def countdown(num):
    while num > 0:
        yield num
        num -= 1

for n in countdown(3):
    print(n)  # Outputs: 3, 2, 1

yield が呼び出されると、関数は現在の値を返して一時停止し、next() が再開するのを待ちます。


3.ジェネレーターがメモリ効率の良い理由

ジェネレーターはその場で値を計算します。これは、遅延評価と呼ばれます。すべての項目をメモリに保存するリストとは異なり、ジェネレーターは必要な場合にのみ項目を生成します。これは次の場合に最適です。

  • ストリーミング データ (例: 大きなファイルからの行の読み取り)。
  • メモリ過負荷なしで大規模または無限のシーケンスを処理

例: ジェネレーターを使用した大きなファイルの読み取り:

def read_large_file(file_path):
    with open(file_path) as file:
        for line in file:
            yield line  # Only processes one line at a time

このアプローチにより、ファイル全体がメモリに読み込まれることがなくなります。これは、大規模なファイルの場合に特に役立ちます。


4.ジェネレーター式: コンパクトな構文

ジェネレーター式 は、リスト内包表記のような角括弧の代わりに括弧を使用して、ジェネレーターを作成する簡潔な方法です。

:

squares = (x * x for x in range(5))
print(next(squares))  # Outputs: 0
print(list(squares))  # Outputs remaining: [1, 4, 9, 16]

ここでは、square は要求されたときにのみ値を計算するため、メモリ効率が高くなります。


5. による発電量を備えた高度な発電機

yield from ステートメントは、ジェネレーターの操作の一部を別のジェネレーターに委任する場合に便利です。これは、モジュール化のためにジェネレーターをサブジェネレーターに分割する場合に役立ちます。

:

def generator_a():
    yield 1
    yield 2

def generator_b():
    yield from generator_a()
    yield 3

for val in generator_b():
    print(val)  # Outputs: 1, 2, 3

特に複雑なジェネレータ チェーンやネストされたジェネレータ チェーンにおいて、コードを合理化します。


6.パフォーマンスに関する考慮事項: ジェネレーターとリスト

ジェネレーターは、次の場合に特に役立ちます。

  • データが大きすぎて一度にメモリに収まりません。
  • データの一部のみが必要な場合があります。
  • 大きなリストを事前に初期化するオーバーヘッドを回避したいと考えています。

一方、リストは次の場合に適しています。

  • データに繰り返しアクセスする必要があります。
  • データセットは小さいため、すべてを一度に読み込むことができます。
  • ランダム アクセスが必要です (ジェネレーターはインデックス作成をサポートしていません)。

結論: 強力なデータ ツールとしてのイテレータとジェネレータ

Python では、イテレータとジェネレータを使用して、メモリ効率と柔軟性を備えたデータ処理を制御できます。これらは、大規模なデータセットの処理、データのストリーミング、カスタムの反復可能なオブジェクトの構築に不可欠です。
これらをマスターすれば、Python プロのようにデータを扱えるようになります! ?

以上がPython イテレータについての深い理解: `__iter__` と `__next__` を使用したデータのナビゲーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。