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 的这个领域没有深入研究。
谢谢!