2012-06-07 49 views
4

我正在使用python-3.2.3 64位,我看到一些奇怪的行爲。Python:解釋器返回對象/函數而不是評估

例如使用解釋器時: 所述輸入

>>> range(10) 

導致輸出

range(0, 10) 

當它應該打印

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Simmilary輸入

>>> l = range(10) 
>>> f = filter(lambda x: x<2, l) 
>>> f 

導致輸出

<filter object at 0x00000000033481D0> 

,但它應該是

[0, 1] 

很顯然,我不能這樣做與任何對象:

>>>> len(f) 
Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    len(f) 
TypeError: object of type 'filter' has no len() 

請告訴我錯在這裏?

+1

好吧,我顯然讀錯了文檔,尷尬。對不起,感謝您指出。它現在清楚了。 –

回答

18

沒有錯。 range()是Py3.x每次產生項目1的時間與生成器不同,它與Py2.x中的行爲不同,它會在當時和之後生成列表,然後將其返回給您。打電話range(10)打電話list(),你會得到你所期望的。

+1

同樣適用於過濾器 – Bernhard

+0

另外,我認爲'f'仍然可以使用,只要你迭代它並且不要期望它像列表一樣工作。 –

3

這些函數返回迭代器對象。您可以使用list(range(0, 10))list(f)將它們轉換爲列表。您也可以通過結果類似迭代:

for i in range(0, 10): 
    print(i) 

最後,你可以使用next函數獲取下一個項目:

l = range(0, 10) 
l1 = next(l) 
l2 = next(l) 

返回迭代器而不是列表允許執行中的項目複雜的操作,而不必將它們全部加載到內存中。例如,您可以遍歷一個巨大的文件並逐字符地轉換它,而無需將整個文件加載到內存中。

相關問題