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

时间:2014-04-09 18:31:36

标签: python range generator xrange

当我遇到RangeGenerator页时,我正在浏览Python Generators Wiki,其中讨论了irange() -

  

这将让我们在没有大量数字的情况下迭代   求助于xrange,这是一个懒惰的列表而不是生成器。

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

2 个答案:

答案 0 :(得分:19)

irange()返回一个生成器类型,只能通过进行迭代。没有其他的。迭代完毕后,生成器就会耗尽,无法重复迭代。

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

>>> xr = xrange(10, 20, 3)
>>> len(xr)
4
>>> 10 in xr
True
>>> xr[0]
10
>>> xr[1]
13

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

>>> for i in xr:
...     print i,
... 
10 13 16 19
>>> for i in xr:
...     print i,
... 
10 13 16 19

您甚至可以使用reversed() function以反向反复迭代

>>> for i in reversed(xr):
...     print i,
... 
19 16 13 10

Python 3 range()类型是xrange()的改进版本,因为它支持更多的序列操作,仍然更有效,并且可以处理超出sys.maxint的值(将会是什么) Python 2)中的long整数。

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

>>> r = range(10, 20, 3)
>>> r[:2]
range(10, 16, 3)

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

>>> r[-2]
16
>>> r[-2:]
range(16, 22, 3)

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

>>> range(10, 20, 3) == range(10, 21, 3)
True

在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

答案 1 :(得分:-2)

irange提供了一个不会将整个结果加载到内存中的生成器。假设您有range(1, 1000000),以防将1000000个数字的列表加载到内存中,而在xrange(1, 1000000)的情况下,一次只有一个数字在内存中。