重複の可能性:
Pythonジェネレーターとイテレーターの違い
Pythonではジェネレーターは大したことのように見えます。ジェネレーターには時々新しい機能が追加されます。
私が見る限り、ジェネレーターの代わりに、イテレーター・インターフェースを備えたオブジェクトをいつでも使用できます。(通常)より簡潔にすることがジェネレーターの唯一の利点ですか、それとも私は何かを見逃していますか?
重複の可能性:
Pythonジェネレーターとイテレーターの違い
Pythonではジェネレーターは大したことのように見えます。ジェネレーターには時々新しい機能が追加されます。
私が見る限り、ジェネレーターの代わりに、イテレーター・インターフェースを備えたオブジェクトをいつでも使用できます。(通常)より簡潔にすることがジェネレーターの唯一の利点ですか、それとも私は何かを見逃していますか?
はい、イテレーターはより一般的な構成であり、ジェネレーターで実行できることはすべてイテレーターで実行できます。
ただし、ジェネレーターは、特定のアイデアを非常にクリーンで簡潔な方法で表現するための非常に優れたツールであり、イテレーターは面倒になります。
たとえば、次のような単純な関数があります。
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の哲学の多くは、読みやすさとシンプルさに基づいています。これに合わせて、ジェネレーターは、イテレーターを必要とする幅広いクラスのタスクに対して、より優れたインターフェースを提供すると思います。はい、イテレータはより強力ですが、ジェネレータの構文上の利点は確かに見逃せません。
イテレータとジェネレータの違いは、ジェネレータが遅延評価を行い、オンデマンドで値を生成し、イテレータがすべての反復で評価してメモリに格納することです。ジェネレーターは、一度に1つの値しか「保持」しないため、巨大なループに適しています。