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

也许我已经成为networking上的错误信息的受害者,但我认为这更可能只是我误解了一些东西。 根据我迄今为止所了解的内容,range()是一个生成器,生成器可以用作迭代器。 但是,这个代码:

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

给我这个错误:

 TypeError: 'range' object is not an iterator 

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

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

所以不, range不是一个发电机。

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

  • 它们是不可变的,所以它们可以用作字典键。
  • 他们具有startstopstep属性(自Python 3.3以来), countindex方法,并支持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