2016-11-23 7 views
1

対私はそれ以下のプログラムは、私は発電機がイテレータとmoreであることを取得するイテレータとgenerator.Iの違いを理解しようとしてきました。 ジェネレータは、イテレータを生成するための簡潔で簡潔な方法です。 しかし、簡潔以外の発電機はイテレータはあなたが投稿したのpython3イテレータは、発電機

def squares(start, stop): 
    for i in range(start, stop): 
     yield i * i 

generator = squares(1, 10) 

print(list(generator)) 


class Squares(object): 
    def __init__(self, start, stop): 
     self.start = start 
     self.stop = stop 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self.start >= self.stop: 
      raise StopIteration 
     current = self.start * self.start 
     self.start += 1 
     return current 


iterator = Squares(1, 10) 

l = [next(iterator) for _ in range(1,10)] 
print(l) 
+2

あなたはすでにそのトピックについていくつかの回答を読んでいますか?例えばhttp://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators – idjaw

+0

また、私は興味深い記事を見つけました:https://www.oreilly.com/ideas/2-great-benefits- – elethan

+0

@idjaw - あなたが提供したリンクからこの例を取り上げました。 – liv2hak

答えて

2

の2つの例は等価ですしないことを提供することを他のいくつかの機能があります。

発生器(ジェネレータない)イテレータを超える提供主な利点は、発電機はより少ないメモリを使用することで高速化することができ、そして無限のストリーム上で使用することができます。あなたはイテレータを使用する場合

、最終的に返却しようとしているすべての項目は、その後、計算された第1の要素が返されます。 2番目の項目が計算される前に、最初の要素が返される発生器

+0

'print(list(generator))'は、 'iterator'を使ったリストの理解と比べて一度に一つのアイテムを生成しますか? – liv2hak

+1

彼らは一度に1つずつ計算します。彼らが各オブジェクトを返すときの違い。私が何かしたい本当に大きなファイル(TB)を持っていると想像してください。私が最初の行をメモリに読み込むジェネレータを持っていれば、それを操作してください。その後、2行目が読み込まれます。したがって、たとえファイルが大きくても無限であっても、ジェネレータはメモリに複数の行を必要としません。一方、イテレータは最初の行をメモリに読み込み、次に2番目の行を読み込みます。最初の行が返される前に、ファイル全体をメモリに読み込もうとします。 – Batman

+0

explantionに感謝します。あなたはおそらく、イテレータと発電機の間のこの違いを強調例(大きなファイルを扱うすなわち1)に私を指すことができ – liv2hak