2013-05-19 5 views
7

Pythonのitertools.cycleのドキュメントは、()のような擬似コード実装与える:以下なぜPythonのitertools.cycleはイテレートのコピーを作成する必要がありますか?

def cycle(iterable): 
    # cycle('ABCD') --> A B C D A B C D A B C D ... 
    saved = [] 
    for element in iterable: 
     yield element 
     saved.append(element) 
    while saved: 
     for element in saved: 
       yield element 

を、それが状態:「ノート、ツールキットのこのメンバが重要補助記憶装置を必要とするかもしれない(の長さに応じてiterable)。 "

def loop(iterable): 
    it = iterable.__iter__() 

    while True: 
     try: 
      yield it.next() 
     except StopIteration: 
      it = iterable.__iter__() 
      yield it.next() 

x = {1, 2, 3} 

hard_limit = 6 
for i in loop(x): 
    if hard_limit <= 0: 
     break 

    print i 
    hard_limit -= 1 

プリント:

1 
2 
3 
1 
2 
3 

はい、私は私の実装を実現し、私はこれをしなかった以外

私は基本的に反復可能なのコピーを作成する必要はない、この道を行っていましたstrのためにはうまくいかないかもしれませんが、それはできます。なぜ別のコピーが作成されるのか、もっと興味があります。私はガベージコレクションと関係があると感じていますが、Pythonのこの分野ではよく研究されていません。

ありがとうございます!

+0

@Martijn構文ハイライトをどのように追加しましたか?私はそれをする方法を理解できませんでした... – stantonk

+0

私はしませんでした。私は 'python'タグを追加し、ハイライトが自動的に適用されます。しかし、タグがなくても、強調表示はしばしば正確に推測されます。 –

+0

ああ、python2.7タグはありませんか?奇妙な... – stantonk

答えて

11

イテレータは、を1回だけ反復することができます。

新しいループを繰り返し作成します。サイクルはそれを行うことはできません。あなたが渡したものと一緒に働かなければなりません。cycleは単純に繰り返し可能なものを再現することはできません。したがって、元のイテレータが生成するすべての要素を格納する必要があります。あなたの代わりに、次の発電機に渡すとしたら

、あなたのloop()が失敗した:

def finite_generator(source=[3, 2, 1]): 
    while source: 
     yield source.pop() 

を今すぐあなたのloop()が生成します。

>>> hard_limit = 6 
>>> for i in loop(finite_generator()): 
...  if hard_limit <= 0: 
...   break 
...  print i 
...  hard_limit -= 1 
... 
1 
2 
3 

あなたのコードはcycle()を使用しているシーケンスのために働くだろう過度のことだろう。その場合は、ストレージの負担はcycle()である必要はありません。次のように簡略化してください:

def loop_sequence(seq): 
    while True: 
     for elem in seq: 
      yield elem 
+0

私は本当にここにあなたの答えは...私の質問は入力のコピーを作成する必要がありますか?彼らは、補助記憶の意味を記録することを指摘しています...なぜその問題を解決するだけではないのですか? – stantonk

+0

@stantonk:これは私が扱っていることです。イテレータがその要素を一度しか生成できないことを私はあなたに示しています。これらの要素を繰り返し保存したい場合は、それらの要素を保存する必要があります。 –

+0

@stantonk:新しいイテレータを作成する 'set'の能力に惑わされました。それはまだ要素があるので、毎回同じ要素のための新しいイテレータを生成することができます。 –

関連する問題