1. 程式人生 > >[Python]range與xrange用法對比

[Python]range與xrange用法對比

成了 iter python 單個 我們 for循環 trac ble 可用

【整理內容】具體如下:

先來看如下示例:
>>>x=xrange(0,8)
>>> print x
xrange(8)
>>>print x[0]
0
>>>print x[7]
7
>>>print x[8]
Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: xrange object index out of range
>>> x=range(0,8)
>>>

print x
[0, 1, 2, 3, 4, 5, 6, 7]
>>> print x[0]
0
>>> print x[8]
Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of rangerange([start,] stop [,step])->list of integers


range(start, stop, step)返回一個遞增或遞減的數字列表,列表的元素值由三個參數決定:

start表示列表開始的值,可省,默認為“0”
stop表示列表結束的值,該參數不可缺少
參數step表示步長,可省,默認值為“1”
range返回的是一個列表,一次性計算並返回所有的值

xrange是一個類,返回的是一個生成器:
生成器是一個可叠代對象,在對生成器進行叠代時,元素是逐個被創建的
使用xrange()進行遍歷,每次遍歷只返回一個值
一般來看,在對大序列進行叠代的時候,因為xrange的特性,所以它會比較節約內存
因此,xrange的執行效率要高於range

首先,我們來看Python 2裏range()。它是一個內置函數,這個函數用於創建整數等差數列。因此它常被用於for循環。

從官方幫助文檔,我們可以看出下面的特性:
1、內置函數(built-in)
2、接受3個參數分別是start, stop和step(其中start和step是可選的,stop是必需的)
3、如果沒有指定start,默認從0開始(python都是從0開始的)
4、如果沒有指定step,默認step是1。(step不能是0,如果指定step為0,“ValueError: range() step argument must not be zero”將會被拋出)

接下來看看xrange()。 xrange()雖然也是內置函數,但是它被定義成了Python裏一種類型(type),這種類型就叫xrange。我們從Python 2的interactive shell裏很容易看到這點。

我們從xragne的官方幫助文檔可以看出:

xrange和range的參數和用法是相同的。只是xrange()返回的不再是一個數列,而是一個xrange對象。這個對象可以按需生成參數指定範圍內的數字(即元素)。

由於xrange對象是按需生成單個的元素,而不像range那樣,首先創建整個list。所以,在相同的範圍內,xrange占用的內存空間將更小,xrange也會更快。

實際上,xrange由於是在循環內被調用時才會生成元素,因此無論循環多少次,只有當前一個元素占用了內存空間,且每次循環占用的都是相同的單個元素空間。

我們可以粗略的認為,相同n個元素的話,range占用的空間是xrange的n倍。因此,在循環很大情況下,xrange的高效率和快速將表現的很明顯。

總結:
1、range()返回整個list。
2、xrange()返回的是一個xrange object,且這個對象是個iterable。
3、兩者都可用於for循環。
4、xrange()占用更少的內存空間,因為循環時xrange()只生成當前的元素,不像range()一開始就成生成完整的list。

這就是在Python 2裏range和xrange的相同點和區別。

range()和xrange() 在Python 2裏是兩種不同的實現。但是在Python 3裏,range()這種實現被移除了;保留了xrange()的實現,且將xrange()重新命名成range()。

[Python]range與xrange用法對比