無論是range()還是xrange()都是Python裡的内置函數。這個兩個内置函數最常用在for循環中。range()和xrange() 在Python 2裡是兩種不同的實作。

但是在Python 3裡,range()這種實作被移除了;保留了xrange()的實作,且将xrange()重新命名成range()。
首先,我們來看Python 2裡range()。它是一個内置函數,這個函數用于建立整數等差數列,是以它常被用于for循環。
從官方幫助文檔,我們可以看出下面的特性:
- 内置函數(built-in);
- 接受3個參數分别是start, stop和step(其中start和step是可選的,stop是必需的);
- 如果沒有指定start,預設從0開始(Python都是從0開始的);
- 如果沒有指定step,預設step是1。(step不能是0,如果指定step為0,“ValueError: range() step argument must not be zero”将會被抛出)。
接下來看看xrange()。 xrange()雖然也是内置函數,但是它被定義成了Python裡一種類型(type),這種類型就叫xrange。我們從Python 2的interactive shell裡很容易看到這點。
從文檔裡可以看出,xrange和range的參數和用法是相同的。隻是xrange()傳回的不再是一個數列,而是一個xrange對象。這個對象可以按需生成參數指定範圍内的數字(即元素)。由于xrange對象是按需生成單個的元素,而不像range那樣,首先建立整個list。是以,在相同的範圍内,xrange占用的記憶體空間将更小,xrange也會更快。實際上,xrange由于是在循環内被調用時才會生成元素,是以無論循環多少次,隻有目前一個元素占用了記憶體空間,且每次循環占用的都是相同的單個元素空間。我們可以粗略的認為,相同n個元素的話,range占用的空間是xrange的n倍。是以,在循環很大情況下,xrange的高效率和快速将表現的很明顯。
總結一下:
- range()傳回整個list;
- xrange()傳回的是一個xrange object,且這個對象是個iterable;
- 兩者都用與for循環;
-
xrange()占用更少的記憶體空間,因為循環時xrange()隻生成目前的元素,不像range()一開始就成生成完整的list。
這就是在Python 2裡range和xrange的相同點和差別。
請了解下面這句話:
“The advantage of the range type over a regular list or tuple is that a range object will always take the same (small) amount of memory, no matter the size of the range it represents (as it only stores the start, stop and step values, calculating individual items and subranges as needed).”