如果range()是Python 3.3中的生成器,为什么我不能在一个范围内调用next()?

问题描述 投票:55回答:1

也许我已经成为网络上错误信息的牺牲品,但我认为这更可能只是因为我误解了某些东西。根据我到目前为止所学到的,range()是一个生成器,生成器可以用作迭代器。但是,这段代码:

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

给我这个错误:

TypeError: 'range' object is not an iterator

我在这里错过了什么?我期待这打印0,并推进到myrange的下一个值。我是Python的新手,所以请接受我对这个相当基本的问题的道歉,但我无法在其他任何地方找到一个好的解释。

python python-3.x iterator generator typeerror
1个回答
74
投票

range是一类不可变的可迭代对象。他们的迭代行为可以与lists进行比较:你不能直接在它们上面调用next;你必须使用iter得到一个迭代器。

所以不,range不是发电机。

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

  • 它们是不可变的,因此它们可以用作字典键。
  • 他们有startstopstep属性(自Python 3.3),countindex方法,他们支持inlen__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
© www.soinside.com 2019 - 2024. All rights reserved.