2014-07-18 54 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中运行的代码,并且您需要将结果作为列表,则可以执行相同的操作。