16

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

这将让我们在不使用 xrange 的情况下迭代大范围的数字,这是一个惰性列表,而不是生成器。

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

4

2 回答 2

26

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

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

>>> 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()函数有效地反向迭代它们:

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

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

例如,它支持切片,这会为切片值生成一个新对象: 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
于 2014-04-09T18:36:31.043 回答
-2

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

于 2015-06-24T12:21:05.897 回答