【Python2】range與xrange用法對比

博主根據兩篇文章對Python2中range和xrange的用法進行了較爲全面的對比和總結,原文鏈接如下:

1、http://www.jb51.net/article/64108.htm

2、http://blog.chinaunix.net/uid-15174104-id-4144683.html


【整理內容】具體如下:


先來看如下示例:

>>> 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 range
range([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循環。

下面是range()的官方幫助文檔

Help on built-in function range in module __builtin__:
range(...)
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers
Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
(END)

從官方幫助文檔,我們可以看出下面的特性:
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的官方幫助文檔:

Help on class xrange in module __builtin__:
class xrange(object)
| xrange(stop) -> xrange object
| xrange(start, stop[, step]) -> xrange object
|
| Like range(), but instead of returning a list, returns an object that
| generates the numbers in the range on demand. For looping, this is
| slightly faster than range() and more memory efficient.
|
| Methods defined here:
|
| __getattribute__(...)
| x.__getattribute__('name') <==> x.name
|
| __getitem__(...)
| x.__getitem__(y) <==> x[y]
|
| __iter__(...)
| x.__iter__() <==> iter(x)
|
| __len__(...)
| x.__len__() <==> len(x)
|
| __reduce__(...)
|
| __repr__(...)
| x.__repr__() <==> repr(x)
|
| __reversed__(...)
| Returns a reverse iterator.
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __new__ = <built-in method __new__ of type object>
| T.__new__(S, ...) -> a new object with type S, a subtype of T
(END)

從文檔裏可以看出,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程序設計有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章