示例自定义范围类不会像内置范围一样重置或“可重用”。怎么才能做到这样呢?
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 的行为。
您在示例中引入的只是一个“生成器函数” - 每次调用它时都会创建一个一次性迭代器。
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
一个实现迭代器协议的简单类就可以解决问题:
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迭代中调用,因此每次都会返回一个新的生成器。 在您尝试的普通生成器函数中,该函数仅被调用一次。