为什么Python-3中的范围没有消耗殆尽?

Ren*_*der 4 python range python-3.x

如果我执行以下操作:

a = range(9)

for i in a:
    print(i)

# Must be exhausted by now
for i in a:
    print(i)

# It starts over!
Run Code Online (Sandbox Code Playgroud)

Python的生成器在提升StopIteration之后通常会停止循环.那么范围如何产生这种模式 - 它在每次迭代后重新开始.

Pet*_*erE 5

正如其他人所说,range不是生成器,而是序列类型(如列表),使其iterable与a不同iterator.

之间的差异iterable,iterator以及generator细微的(至少对于有人新的Python).

  • 一个iterator提供了一个__next__方法,并且可以排出,因此提高StopIteration.
  • An iterable是一个提供iterator内容的对象.每当__iter__调用它的方法时,它返回一个新的迭代器对象,因此你可以(间接地)迭代它多次.
  • A generator是一个返回的函数iterator,其原因可能会耗尽.

  • 另外要知道的是,for循环会自动查询iterator任何循环iterable.这就是为什么你可以写for x in iterable: pass而不是for x in iterable.__iter__(): passfor x in iter(iterable): pass.

所有这些都在文档中,但恕我直言有点难以找到.最好的起点可能是词汇表.