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


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

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

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


2624
2018-04-09 18:31


起源



答案:


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

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

>>> 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 3 range() type是改进版 xrange(),因为它支持更多的序列操作,仍然更有效,并且可以处理超出的值 sys.maxint (会是什么样的 long Python中的整数2)。

例如,它支持切片,从而产生一个切片   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

18
2018-04-09 18:36



加 xrange 在CPython中有C长期限制, irange 不会遭遇那个问题。 - Ashwini Chaudhary


答案:


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

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

>>> 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 3 range() type是改进版 xrange(),因为它支持更多的序列操作,仍然更有效,并且可以处理超出的值 sys.maxint (会是什么样的 long Python中的整数2)。

例如,它支持切片,从而产生一个切片   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

18
2018-04-09 18:36



加 xrange 在CPython中有C长期限制, irange 不会遭遇那个问题。 - Ashwini Chaudhary


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


-2
2018-06-24 12:21



你用过的答案中有错字 range() 两次。 Python 2也有 xrange() 它也不会产生完整的整数列表。你实际上没有回答这个问题 irange() 实现与Python 2不同 xrange() 目的。 - Martijn Pieters♦