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
以下に、次のように述べています。
私は基本的にこのパスをたどっていましたが、これを行った場合は、イテラブルのコピーを作成する必要はありません。
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 のこの分野についてはよく勉強していません。
ありがとう!