2014-07-18 53 views
0

我試着使用匿名函數filter()的許多不同的例子,但只要我在字符串上使用它,總會得到奇怪的結果。下面是一個例子:是否在Python 2.x和3.x之間更改了`filter()`?

>>>print(filter(lambda x: x.isdigit(), "aas30dsa20")) 
<filter object at 0x00000000035DE470> 

如果不是字符串,一切工作正常。例如;

>>> print(list(filter(lambda x: x >= 30 and x <= 70, [x**2 for x in range(1,11)]))) 
[36, 49, 64] 

順便說一句,如果我刪除list()功能部分,會出現類似於字符串大小寫問題:

>>> print(filter(lambda x: x >= 30 and x <= 70, [x**2 for x in range(1,11)])) 
<filter object at 0x00000000037BFDD8> 

我使用Python 3.4.1在Windows 7

+1

總之:[是](https://docs.python.org/3.0/whatsnew/3.0.html#views-and-iterators-instead-of-lists)。 – jonrsharpe

回答

2

是。幾個功能工具(最着名的是filter()map())被更改爲返回迭代器,而不是3.x的序列。

1

在Python 2中,filter()函數返回一個列表,該列表是對序列中每個項目返回True或False的函數篩選序列的結果。在Python 3中,filter()函數返回一個迭代器,而不是一個列表。 來源:diveintopython3.net

2to3 tool在某些情況下,將調用list()調用來調用filter()以確保結果仍然是一個列表。如果您需要在沒有2to3轉換的情況下在Python 2和Python 3中運行的代碼,並且您需要將結果作爲列表,則可以執行相同的操作。