2013-05-17 110 views
4

根據Python文檔,當我做範圍(0,10)時,此函數的輸出是從0到9的列表,即[0,1,2,3,4,5,6,7,8,9 ]。但是,我的電腦上的Python安裝不會輸出這個,儘管這個在線工作的例子很多。爲什麼我的範圍函數的輸出不是列表?

這裏是我的測試代碼...

test_range_function = range(0, 10) 
print(test_range_function) 
print(type(test_range_function)) 

的這個我想應該名單打印輸出,並且類型函數應該輸出爲一個列表。相反,我得到下面的輸出...

c:\Programming>python range.py 
range(0, 10) 
<class 'range'> 

我沒有任何的例子在網上看到了這一點,真的希望一些光在這所流下。

+9

您是否閱讀過3.x版本的python doc?要獲得一個列表,你必須做'list(range(0,10))'。 – 2013-05-17 22:34:59

+3

這是從2.x到3的變化,記錄在這裏:http://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists。無論如何,大多數情況下你最好用迭代器,但是arbauthc的評論顯示如果你確實需要它,就創建列表。 –

+1

如果您正在查看[Python在線文檔](http://docs.python.org/3/index.html),請務必閱讀正在使用的版本的文檔。在每個頁面的左上角有一個小小的選項菜單,例如「2.7.5」,您可以更改爲「3.3」。 – abarnert

回答

11

這是因爲range和其他函數式方法(如map,reducefilter)在Python 3中返回迭代器。在Python 2中,它們返回列表。

What’s New In Python 3.0

range()現在的行爲像用來表現xrange(),除了它具有任意大小的 價值的作品。後者不再存在。

要一個iterator轉換到一個列表,你可以使用list功能:

>>> list(range(5)) #you can use list() 
[0, 1, 2, 3, 4] 
4

通常不需要兌現的範圍爲實際的名單,但只是想遍歷它。特別是對於使用迭代器的更大範圍來說,可以節省內存

因此,Python 3中的range()返回一個迭代器(如Python 2中的xrange())。如果因爲某些原因需要實際列表,請使用list(range(..))

+6

+1,這解釋了改變的原因以及改善的原因。一個細微的區別 - 在3.x中的'range()'返回一個可迭代的,而不是一個迭代器。它比直接迭代器有一些優點,比如它在循環時沒有耗盡,並且它是一個序列,所以你可以對它進行切片等...'range(10)[:5] == range(0,5 )'。 –

+1

...並且它也實現了O(1)'__contains__'。所以當新手在範圍(1,21,2)中寫入5(像他們一樣),它不再是一個錯誤,而是一個很好且完美的慣用代碼。 – abarnert

相關問題