如果range()是Python 3.3中的生成器,为什么不能在范围上调用next()?
问题内容:
也许我已成为网络错误信息的受害者,但我认为更可能是我误解了一些信息。根据到目前为止的知识,range()是一个生成器,并且生成器可以用作迭代器。但是,此代码:
myrange = range(10)
print(next(myrange))
给我这个错误:
TypeError: 'range' object is not an iterator
我在这里想念什么?我期望它打印0,并前进到中的下一个值myrange
。我是Python的新手,所以请接受我对这个基本问题的歉意,但在其他任何地方都找不到很好的解释。
问题答案:
range
是一类不变的可迭代对象。可以将它们的迭代行为与list
s进行比较:您不能next
直接调用它们;您必须使用来获得迭代器iter
。
所以不,range
不是发电机。
您可能会想,“他们为什么不直接迭代呢?”?好吧,range
s具有一些有用的属性,而这是不可能的:
- 它们是不可变的,因此可以用作字典键。
- 他们有
start
,stop
和step
属性(因为Python 3.3),count
和index
方法,它们支持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