如果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
有一些有用的属性,这是不可能的:
- 它们是不可变的,所以它们可以用作字典键。
- 他们具有
start
,stop
和step
属性(自Python 3.3以来),count
和index
方法,并支持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