簡體   English   中英

irange()與range()或xrange()有何不同?

[英]How is irange() any different from range() or xrange()?

當我遇到這個RangeGenerator頁面時,我正在瀏覽Python Generators Wiki,其中討論了irange() -

這將使我們可以迭代大范圍的數字,而無需求助於xrange,它是一個懶惰列表,而不是生成器。

我似乎無法理解該頁面上描述的測試套件和實現。 我知道range()在內存中創建了一個列表(從Python 2.7的角度來看),而xrange()是一個生成器。 irange()有何不同?

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()類型是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

irange提供了一個不會將整個結果加載到內存中的生成器。 假設您有range(1, 1000000) ,以防將一百萬個數字的列表加載到內存中,而對於xrange(1, 1000000) ,一次僅一個數字將在內存中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM