回顾itertools.cycle的实现细节,在我看来,while循环用于重置生成器(具有yield的函数)并提供无限重复的iterable,但如果是这样,则不是向上移动一会儿,然后删除该方法的后半部分。假设它们比我聪明,我假设我丢失了一些东西,尽管下面的第二个函数似乎可以处理屈服的字典,列表和字符串。
https://docs.python.org/3.7/library/itertools.html#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
vs。
def cycle_huh(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
while True:
for element in iterable:
yield element
我一定想念什么吗?或者是一个可迭代的类型,其中第一个是必需的,而第二个将破坏它。
答案 0 :(得分:2)
如果iterable
是生成器或其他适当的迭代器(而不是列表),则它将在for element in iterable
循环的第一次通过中耗尽,随后在此循环中通过什么也不会产生。您需要在第一次迭代时将iterable的内容保存在某个地方,以免发生这种情况。