【Python那些事兒】range()和xrange()__Python

來源:互聯網
上載者:User

無論是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).”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.