Python重置或重用自定义范围类

cunj1qz1  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(145)

示例自定义范围类不像内置范围那样被重置或“可重用”。如何使其如此?

def exampleCustomRange(stopExclusive):
  for i in range(stopExclusive):
    yield i

>> builtinRange = range(3)
>> [x for x in builtinRange]
[0, 1, 2]
>> [x for x in builtinRange]
[0, 1, 2] # See how this repeats on a second try? It is reusable or reset.
>> customRange = exampleCustomRange(3)
>> [x for x in customRange]
[0, 1, 2]
>> [x for x in customRange]
[] # See how this is now empty? It is not reusable or reset.

字符串
上面repl中显示的customRange的第二次使用不像内置范围那样重复、重置或重用。我想匹配builtinRange的行为。

bis0qfac

bis0qfac1#

你在例子中引入的只是一个“生成器函数”--每次调用它时都会创建一个一次性迭代器。
bull-in range实际上是一个类,它会将其给定的参数注解为内部状态,并在每次请求时创建一个新的生成器。
这应该像你期望的那样工作,而不是:

class ExampleCustomRange:
    def __init__(self, stop_exclusive):
        self.stop_exclusive = stop_exclusive

    def __iter__(self):
        for i in range(self.stop_exclusive):
           yield i

字符串

sd2nnvve

sd2nnvve2#

一个实现iterator protocol的简单类就可以做到这一点:

class exampleCustomRange:
    def __init__(self, stop):
        self.stop = stop

    def __iter__(self):
        for i in range(self.stop):
            yield i

>>> e = exampleCustomRange(3)
>>> list(e)
[0, 1, 2]
>>> list(e)
[0, 1, 2]
>>> list(e)
[0, 1, 2]

字符串
主要区别在于__iter__方法在e的每一次 new 迭代中都被调用,因此每次都返回一个新的生成器。在你尝试的普通生成器函数中,该函数只被调用一次。

相关问题