ホームページ >バックエンド開発 >Python チュートリアル >Python ジェネレーターとイテレーターの主な違いは何ですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-26 13:32:11698ブラウズ

What's the Key Difference Between Python Generators and Iterators?

Python のジェネレーターとイテレーターの違いを理解する

他の多くのプログラミング言語と同様、Python は、ジェネレーターとイテレーターという 2 つの異なる反復メカニズムを提供します。 。どちらも要素のシーケンスを走査できますが、機能と実装において根本的な違いがあります。

イテレータは、__iter__() メソッドと __next__() メソッドを実装するオブジェクトです。 Python は内部で for ループを使用してイテレータの要素にアクセスします。リスト、タプル、イテレータなどのイテラブルは、__iter__() メソッドでイテレータを作成することから始まり、その後の反復では、__next__() メソッドを呼び出して各要素を順番に返します。使用可能な要素がもうない場合、StopIteration 例外が発生します。

イテレーターとは異なり、ジェネレーターは値を返すのではなく生成する関数です。ジェネレーター関数が呼び出されると、ジェネレーター オブジェクトが生成されます。ジェネレーター オブジェクトの __iter__() メソッドはそれ自体を返します。ジェネレーターを反復するには、for ループを使用できます。各反復では、__next__() メソッドを呼び出して次の値を生成します。すべての値が生成されると、StopIteration 例外が発生します。

ジェネレーターとイテレーターの主な違いは、メモリ消費量にあります。ジェネレーターは一般に、一度に 1 つずつ値を生成し、シーケンス全体をメモリーに保管する必要がないため、メモリー効率が高くなります。一方、イテレータは反復前にシーケンス全体を構築し、より多くのスペースを利用します。

イテレータとジェネレータを使用する場合

イテレータとジェネレータのどちらを使用するかの選択ジェネレーターはアプリケーションの特定の要件によって異なります。以下にいくつかのガイドラインを示します:

  • 反復子を使用します: シーケンスが事前にわかっていて、変更または複数回走査する必要がある場合。イテレーターは、シーケンス要素にランダムにアクセスする必要があるシナリオに適しています。
  • ジェネレーターを使用する: シーケンスが動的に生成される場合、または 1 回だけアクセスする必要がある場合。ジェネレーターはオンデマンドで値を生成することでメモリのオーバーヘッドを削減できるため、大規模なシーケンスやストリーミング データの処理が必要な状況に最適です。

次のコード:

def my_iterator():
    for i in range(5):
        yield i

この関数は、0 から 0 までの整数を生成する反復子を返します。 4. 対照的に、次のコードはジェネレーターを示しています。

def my_generator():
    for i in range(5):
        yield i

反復子とジェネレーターはどちらも同じ整数シーケンスを生成しますが、実装方法は大きく異なります。イテレータは値を保存するための内部リストを作成しますが、ジェネレータは中間データ構造を作成せずに値を生成します。

以上がPython ジェネレーターとイテレーターの主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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