イテレータ は、2 つのメソッドを実装するオブジェクトです。
基本的なイテレータの作成:
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() 呼び出しを手動で制御し、最後に到達すると停止します。イテレータは、各要素がオンデマンドで処理されるシーケンスを操作する場合に役立ちます。
ジェネレーター は、イテレーターを作成する簡単な方法です。 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() が再開するのを待ちます。
ジェネレーターはその場で値を計算します。これは、遅延評価と呼ばれます。すべての項目をメモリに保存するリストとは異なり、ジェネレーターは必要な場合にのみ項目を生成します。これは次の場合に最適です。
例: ジェネレーターを使用した大きなファイルの読み取り:
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
このアプローチにより、ファイル全体がメモリに読み込まれることがなくなります。これは、大規模なファイルの場合に特に役立ちます。
ジェネレーター式 は、リスト内包表記のような角括弧の代わりに括弧を使用して、ジェネレーターを作成する簡潔な方法です。
例:
squares = (x * x for x in range(5)) print(next(squares)) # Outputs: 0 print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
ここでは、square は要求されたときにのみ値を計算するため、メモリ効率が高くなります。
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
特に複雑なジェネレータ チェーンやネストされたジェネレータ チェーンにおいて、コードを合理化します。
ジェネレーターは、次の場合に特に役立ちます。
一方、リストは次の場合に適しています。
Python では、イテレータとジェネレータを使用して、メモリ効率と柔軟性を備えたデータ処理を制御できます。これらは、大規模なデータセットの処理、データのストリーミング、カスタムの反復可能なオブジェクトの構築に不可欠です。
これらをマスターすれば、Python プロのようにデータを扱えるようになります! ?
以上がPython イテレータについての深い理解: `__iter__` と `__next__` を使用したデータのナビゲーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。