[英]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.