如果range()是Python3.3中的生成器,为什么不能对range调用next()呢?

2024-10-03 13:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

给我这个错误:

TypeError: 'range' object is not an iterator

我错过了什么?我希望它打印0,并前进到myrange中的下一个值。我是Python新手,所以请接受我对这个基本问题的歉意,但我在其他地方找不到好的解释。


Tags: 代码网络anobjectis错误notrange
1条回答
网友
1楼 · 发布于 2024-10-03 13:18:23

range是一类不可变的iterable对象。它们的迭代行为可以与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

相关问题 更多 >