如何通过生成器或其他方式在Python中无限循环迭代器?

ano*_*ard 13 python loops generator

我的理解是使用Generator是实现这类目标的最佳方式,但我愿意接受建议.

具体来说,一个用例是这样的:我想打印一些项目和另一个列表,任意长度,必要时截断初始迭代器.

这是工作的python代码,演示了我想要的确切示例行为:

    def loop_list(iterable):
        """
        Return a Generator that will infinitely repeat the given iterable.

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 11):
        ...     print i, l.next()
        ... 
        1 sam
        2 max
        3 sam
        4 max
        5 sam
        6 max
        7 sam
        8 max
        9 sam
        10 max

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 2):
        ...     print i, l.next()
        ... 
        1 sam
        """
        iterable = tuple(iterable)
        l = len(iterable)
        num = 0
        while num < l:
            yield iterable[num]
            num += 1
            if num >= l:
                num = 0
Run Code Online (Sandbox Code Playgroud)

问题/我的问题

您可能已经注意到,这仅适用于实现的列表/元组/迭代__getitem__(如果我没有记错的话).理想情况下,我希望能够传递任何可迭代的,并接收一个可以正确循环其内容的生成器.

如果有一个更好的方法来做这样的事情没有发电机,我也很好.

Jon*_*ier 53

您可以使用itertools.cycle(链接页面上包含的来源).

import itertools

a = [1, 2, 3]

for element in itertools.cycle(a):
    print element

# -> 1 2 3 1 2 3 1 2 3 1 2 3 ...
Run Code Online (Sandbox Code Playgroud)


小智 13

尝试这个-

L = [10,20,30,40]

def gentr_fn(alist):
    while 1:
        for j in alist:
            yield j

a = gentr_fn(L)
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()
print a.next()

>>gentr_fn(x,y)
10 20 30 40 10 20 30 ...
Run Code Online (Sandbox Code Playgroud)