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

cunj1qz1  于 2024-01-05  发布在  Python
关注(0)|答案(2)|浏览(168)

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

  1. def exampleCustomRange(stopExclusive):
  2. for i in range(stopExclusive):
  3. yield i
  4. >> builtinRange = range(3)
  5. >> [x for x in builtinRange]
  6. [0, 1, 2]
  7. >> [x for x in builtinRange]
  8. [0, 1, 2] # See how this repeats on a second try? It is reusable or reset.
  9. >> customRange = exampleCustomRange(3)
  10. >> [x for x in customRange]
  11. [0, 1, 2]
  12. >> [x for x in customRange]
  13. [] # See how this is now empty? It is not reusable or reset.

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

bis0qfac

bis0qfac1#

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

  1. class ExampleCustomRange:
  2. def __init__(self, stop_exclusive):
  3. self.stop_exclusive = stop_exclusive
  4. def __iter__(self):
  5. for i in range(self.stop_exclusive):
  6. yield i

字符串

sd2nnvve

sd2nnvve2#

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

  1. class exampleCustomRange:
  2. def __init__(self, stop):
  3. self.stop = stop
  4. def __iter__(self):
  5. for i in range(self.stop):
  6. yield i
  7. >>> e = exampleCustomRange(3)
  8. >>> list(e)
  9. [0, 1, 2]
  10. >>> list(e)
  11. [0, 1, 2]
  12. >>> list(e)
  13. [0, 1, 2]

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

展开查看全部

相关问题