【问题标题】:How is irange() any different from range() or xrange()?orange() 与 range() 和 xrange() 有何不同?
【发布时间】:2014-05-23 03:48:26
【问题描述】:

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

这将让我们迭代大范围的数字,而无需 求助于 xrange,这是一个惰性列表,而不是生成器。

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

【问题讨论】:

    标签: python range generator xrange


    【解决方案1】:

    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)。

    它支持切片,例如,切片值会生成一个 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
    

    【讨论】:

    • 加上 xrange 在 CPython 中有 C 长的限制,irange 不会遇到这个问题。
    【解决方案2】:

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

    【讨论】:

    • 您的回答有误,您使用了两次range()。 Python 2 也有xrange(),它也不会预先生成完整的整数列表。你实际上并没有回答这个问题,为什么 irange() 实现不同于 Python 2 的 xrange() 对象。
    猜你喜欢
    • 2019-01-23
    • 2018-02-18
    • 1970-01-01
    • 2010-09-10
    • 2010-09-13
    相关资源
    最近更新 更多