相关疑难解决方法(0)

如何在Python中制作重复生成器

你如何在Python中创建像xrange这样的重复生成器?例如,如果我这样做:

>>> m = xrange(5)
>>> print list(m)
>>> print list(m)
Run Code Online (Sandbox Code Playgroud)

我两次得到相同的结果 - 数字0..4.但是,如果我尝试使用yield:

>>> def myxrange(n):
...   i = 0
...   while i < n:
...     yield i
...     i += 1
>>> m = myxrange(5)
>>> print list(m)
>>> print list(m)
Run Code Online (Sandbox Code Playgroud)

我第二次尝试迭代m,我什么都没回来 - 一个空列表.

有没有一种简单的方法可以创建像xrange那样的带有yield或生成器理解的重复生成器?我找到了Python跟踪器问题的解决方法,该问题使用装饰器将生成器转换为迭代器.每次开始使用它时都会重新启动,即使您上次没有使用所有值,就像xrange一样.我也提出了我自己的装饰器,基于相同的想法,实际上返回一个生成器,但一个可以在抛出StopIteration异常后重新启动:

@decorator.decorator
def eternal(genfunc, *args, **kwargs):
  class _iterable:
    iter = None
    def __iter__(self): return self
    def next(self, *nargs, **nkwargs):
      self.iter = self.iter or genfunc(*args, **kwargs):
      try:
        return self.iter.next(*nargs, **nkwargs)
      except StopIteration:
        self.iter …
Run Code Online (Sandbox Code Playgroud)

python

20
推荐指数
2
解决办法
9960
查看次数

标签 统计

python ×1