irange()与range()或xrange()有什么不同?

nsa*_*ane 14 python generator range xrange

当我遇到这个RangeGenerator页面时,我正在浏览Python Generators Wiki,该页面谈到irange() -

这将让我们迭代大量数字而不诉诸xrange,这是一个惰性列表而不是生成器.

我似乎无法理解该页面上描述的测试套件和实现.我知道range()在内存中创建一个列表(从Python 2.7的角度来看)并且xrange()是一个生成器.有irange()什么不同?

Mar*_*ers 20

irange()返回一个只能迭代的生成器类型.没有其他的.一旦迭代它,生成器就会耗尽,无法再次迭代.

Python 2 xrange()类型和Python 3 range()类型序列类型,它们支持其他序列支持的各种操作,例如报告它们的长度,测试包含和索引:

>>> xr = xrange(10, 20, 3)
>>> len(xr)
4
>>> 10 in xr
True
>>> xr[0]
10
>>> xr[1]
13
Run Code Online (Sandbox Code Playgroud)

您可以多次迭代这些对象:

>>> for i in xr:
...     print i,
... 
10 13 16 19
>>> for i in xr:
...     print i,
... 
10 13 16 19
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用该reversed()函数相反的方式有效地迭代它们:

>>> for i in reversed(xr):
...     print i,
... 
19 16 13 10
Run Code Online (Sandbox Code Playgroud)

Python 3 range()类型是一个改进版本xrange(),因为它支持更多的序列操作,更高效,并且可以处理超出的值sys.maxint(longPython 2中的整数).

例如,它支持切片,从而为切片值生成一个 range()对象:

>>> r = range(10, 20, 3)
>>> r[:2]
range(10, 16, 3)
Run Code Online (Sandbox Code Playgroud)

您可以像使用其他Python序列一样使用负索引,以从末尾开始计算元素:

>>> r[-2]
16
>>> r[-2:]
range(16, 22, 3)
Run Code Online (Sandbox Code Playgroud)

并且该类型支持测试相等性; range()如果它们产生相同的值,则两个实例相等:

>>> range(10, 20, 3) == range(10, 21, 3)
True
Run Code Online (Sandbox Code Playgroud)

在Python 2中,生成器irange()可能具有的唯一优势是它不会受到以下非长整数的限制xrange():

>>> import sys
>>> xrange(sys.maxint)
xrange(9223372036854775807)
>>> xrange(sys.maxint + 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)

  • 加上'xrange`在CPython中有C长限制,`irange`不会受到这个问题的影响. (2认同)