示例自定义范围类不像内置范围那样被重置或“可重用”。如何使其如此?
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的行为。
2条答案
按热度按时间bis0qfac1#
你在例子中引入的只是一个“生成器函数”--每次调用它时都会创建一个一次性迭代器。
bull-in
range
实际上是一个类,它会将其给定的参数注解为内部状态,并在每次请求时创建一个新的生成器。这应该像你期望的那样工作,而不是:
字符串
sd2nnvve2#
一个实现iterator protocol的简单类就可以做到这一点:
字符串
主要区别在于
__iter__
方法在e
的每一次 new 迭代中都被调用,因此每次都返回一个新的生成器。在你尝试的普通生成器函数中,该函数只被调用一次。