derezzed

导航

xrange的区别

xrange的区别

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

问题:

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

给我这个错误:

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

回答:

 range是一类不可变的可迭代对象。他们的迭代行为可以与list进行比较:你不能直接调用next;你必须使用iter来获得一个迭代器
所以不,range不是一个生成器。
你可能会想,“他们为什么不直接迭代”?那么,range有一些有用的属性,这是不可能的:

    • 它们是不可变的,所以它们可以用作字典键。
    • 他们具有startstopstep属性(自Python 3.3以来),countindex方法,并支持inlen__getitem__操作。
    • 您可以多次迭代相同的range

 

 

在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。

这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。

由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。

在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。

 

xrange重命名为range
同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等

posted on 2018-01-05 10:58  derezzed  阅读(165)  评论(0)    收藏  举报