3

重複の可能性:
Pythonジェネレーターとイテレーターの違い

Pythonではジェネレーターは大したことのように見えます。ジェネレーターには時々新しい機能が追加されます。

私が見る限り、ジェネレーターの代わりに、イテレーター・インターフェースを備えたオブジェクトをいつでも使用できます。(通常)より簡潔にすることがジェネレーターの唯一の利点ですか、それとも私は何かを見逃していますか?

4

2 に答える 2

13

はい、イテレーターはより一般的な構成であり、ジェネレーターで実行できることはすべてイテレーターで実行できます。

ただし、ジェネレーターは、特定のアイデアを非常にクリーンで簡潔な方法で表現するための非常に優れたツールであり、イテレーターは面倒になります。

たとえば、次のような単純な関数があります。

def count_to(m):
    n = 0
    while n <= m:
        yield n
        n += 1

素晴らしくて簡単。これはイテレータと同じものです。

class CountTo:
    def __init__(self, m):
        self.m = m
        self.n = 0
    def __iter__(self):
        return self
    def next(self):
        if self.n <= self.m:
            cur, self.n = self.n, self.n + 1
            return cur
        else:
            raise StopIteration()

1つは5行、もう1つは12行です。ジェネレーターは反復プロセスを非常に簡潔に表現し、イテレーターは明示的に維持された状態とボイラープレートコードでそれを難読化します。

Pythonの哲学の多くは、読みやすさとシンプルさに基づいています。これに合わせて、ジェネレーターは、イテレーターを必要とする幅広いクラスのタスクに対して、より優れたインターフェースを提供すると思います。はい、イテレータはより強力ですが、ジェネレータの構文上の利点は確かに見逃せません。

于 2012-10-07T06:29:17.260 に答える
3

イテレータとジェネレータの違いは、ジェネレータが遅延評価を行い、オンデマンドで値を生成し、イテレータがすべての反復で評価してメモリに格納することです。ジェネレーターは、一度に1つの値しか「保持」しないため、巨大なループに適しています。

于 2012-10-07T06:36:41.623 に答える