Python のイテレータとジェネレータの違いは何ですか?
Python プログラミングでは、イテレーターとジェネレーターは、反復可能なオブジェクトを処理するために使用されるツールです。どちらもデータの走査に使用できますが、実装にはいくつかの違いがあります。
イテレータは、イテレータ プロトコルを実装するオブジェクトです。イテレータ オブジェクトには、__iter__()
と __next__()
という 2 つのメソッドが含まれている必要があります。このうち、__iter__()
メソッドは反復子オブジェクト自体を返し、__next__()
メソッドは反復可能オブジェクト内の次の要素を返します。反復処理する要素がもうない場合、__next__()
メソッドは StopIteration 例外を発生させる必要があります。簡単なイテレータの例を次に示します。
class MyIterator: def __init__(self, limit): self.limit = limit self.current = 0 def __iter__(self): return self def __next__(self): if self.current < self.limit: value = self.current self.current += 1 return value else: raise StopIteration my_iterator = MyIterator(5) for num in my_iterator: print(num)
ジェネレータは、実装がより簡潔である特別な種類のイテレータです。ジェネレーターはキーワード yield
を使用して関数を定義します。関数が呼び出されると、ジェネレーター オブジェクトが返されます。ジェネレーター オブジェクトの __next__()
メソッドが呼び出されるたびに、関数は yield
ステートメントが検出されるまで実行を再開し、yield の後の値が呼び出し元に返され、機能を一時停止しています。実装します。その後、次回 __next__()
メソッドが呼び出されるとき、関数は最後の yield ステートメントを一時停止した場所から、yield ステートメントが再び検出されるまで実行を継続します。以下は、ジェネレーターを使用してフィボナッチ数列を実装するためのサンプル コードです。
def fib_generator(limit): a, b = 0, 1 for _ in range(limit): yield a a, b = b, a + b fib = fib_generator(5) for num in fib: print(num)
イテレーターとジェネレーターは実装方法が異なりますが、使用方法は非常に似ています。 for ループを使用すると、イテレータ オブジェクトとジェネレータ オブジェクトを反復処理し、それらが生成する各要素を取得できます。たとえば、上記のコード例のイテレータ オブジェクト my_iterator
とジェネレータ オブジェクト fib
は、for ループを通じて生成する要素に 1 つずつアクセスできます。
ジェネレーターは遅延評価されることに注意してください。これは、事前にすべての値を生成するのではなく、必要なときにのみ値を生成することを意味します。これにより、ジェネレータはすべてのデータを一度にメモリにロードする必要がなくなるため、大量のデータを処理する際に非常に効率的になります。
要約すると、イテレータはイテレータ プロトコルを実装するオブジェクトであり、ジェネレータは、yield ステートメントを使用して関数を定義する特別なイテレータです。どちらもデータの反復処理に使用できますが、ジェネレーターの方が実装が簡単で、遅延評価が特徴です。実際の開発では、特定のニーズに応じて適切なツールを選択することで、プログラムの効率と可読性を向上させることができます。
以上がPython のイテレータとジェネレータの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。