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

问题描述 投票:0回答:2

示例自定义范围类不会像内置范围一样重置或“可重用”。怎么才能做到这样呢?

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 的行为。

python range generator
2个回答
0
投票

您在示例中引入的只是一个“生成器函数” - 每次调用它时都会创建一个一次性迭代器。

Bult-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

0
投票

一个实现迭代器协议的简单类就可以解决问题:

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
迭代中调用,因此每次都会返回一个新的生成器。 在您尝试的普通生成器函数中,该函数仅被调用一次。

© www.soinside.com 2019 - 2024. All rights reserved.