可重复使用的无限范围

时间:2018-03-25 12:37:10

标签: python iterable

这里有multiple questions询问所有推荐range的无限itertools.count。但是,rangecount没有的能力 - 它可以重复使用。

a = range(100)

# Prints 0 1 2 3
for i in a:
    print(i)
    if i >= 3:
        break

# Prints 0 1 2 3
for i in a:
    print(i)
    if i >= 3:
        break

from itertools import count
b = count(0)

# Prints 0 1 2 3
for i in b:
    print(i)
    if i >= 3:
        break

# Prints 4, does not use a fresh count(0)
for i in b:
    print(i)
    if i >= 3:
        break

有没有办法重用itertools.count或以其他方式获得可重用/重启无限可迭代?

1 个答案:

答案 0 :(得分:2)

根本问题是rangeIterablecountIteratorIterator是具有__next__方法的对象,只能执行一次,而Iterable具有__iter__方法,可以多次调用以返回每次都要新鲜Iterator

一种解决方案是简单地创建自己的Iterablecount,只要调用itertools.count方法,就会返回__iter__

from itertools import count

class Count:
    def __init__(self, start=0):
        self.start = start

    def __iter__(self):
        return count(self.start)