ホームページ  >  記事  >  バックエンド開発  >  Python のイテレータとジェネレータの違いは何ですか?

Python のイテレータとジェネレータの違いは何ですか?

WBOY
WBOYオリジナル
2023-10-20 19:10:551365ブラウズ

Python のイテレータとジェネレータの違いは何ですか?

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 サイトの他の関連記事を参照してください。

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