107

也许我已经成为网络上错误信息的受害者,但我认为更有可能只是我误解了一些东西。根据我目前所了解的,range() 是一个生成器,并且生成器可以用作迭代器。但是,这段代码:

myrange = range(10)
print(next(myrange))

给我这个错误:

TypeError: 'range' object is not an iterator

我在这里想念什么?我期待这会打印 0,并前进到myrange. 我是 Python 新手,所以请接受我对这个相当基本的问题的歉意,但我在其他任何地方都找不到好的解释。

4

1 回答 1

135

range是一类不可变的可迭代对象。它们的迭代行为可以类比为lists:你不能next直接调用它们;您必须使用iter.

所以不,range不是发电机。

你可能会想,“他们为什么不让它直接可迭代”?好吧,ranges 有一些有用的属性是不可能的:

  • 它们是不可变的,因此可以用作字典键。
  • 它们具有start,stopstep属性(从 Python 3.3 开始)countindex方法,并且它们支持in,len__getitem__操作。
  • range您可以多次迭代相同的内容。

>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5
于 2012-10-26T18:21:23.453 回答