创建无限循环发生器的巧妙方法?

时间:2016-07-16 19:51:41

标签: python python-3.x

我想要一个通过值列表无限循环的生成器。

这是我的解决方案,但我可能会错过一个更明显的解决方案。

成分:一个生成器函数,用于展平无限嵌套列表,以及自身列表附件

def ge(x):
    for it in x:
        if isinstance(it, list):
            yield from ge(it)
        else:
            yield(it)


def infinitecyclegenerator(l):
    x = l[:]
    x.append(x)
    yield from ge(x)

使用:

g = infinitecyclegenerator([1,2,3])

next(g) #1
next(g) #2
next(g) #3
next(g) #1
next(g) #2
next(g) #3
next(g) #1
...

正如我所说,我可能会错过一个琐碎的方式来做同样的事情,我会很乐意学习。有更简洁的方式吗?

另外,我是否应该担心内存耗尽,这里有令人难以置信的无穷无尽的信息,或者我的代码是否一切都很酷?

2 个答案:

答案 0 :(得分:7)

您可以使用itertools.cycle来获得相同的结果

  

使迭代器从iterable返回元素并保存a   每个的副本。当iterable耗尽时,返回from中的元素   已保存的副本

强调我的。您对内存的唯一顾虑是保存迭代器返回的每个项目的副本。

>>> from itertools import cycle
>>> c = cycle([1,2,3])
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3

答案 1 :(得分:0)

必须是小时:-)。发布后我意识到的一种显而易见的方式:

def infinitecyclegenerator(l):
    while True:
        for it in l:
            yield it

很抱歉错过了显而易见的事。