`filter()` 在 Python 2.x 和 3.x 之间有变化吗?

1 投票
2 回答
1589 浏览
提问于 2025-04-18 13:48

我尝试了很多关于 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>

我在 Windows 7 上使用的是 Python 3.4.1。

2 个回答

1

在Python 2中,filter()这个函数会返回一个列表,这个列表是通过一个函数对序列中的每个项目进行筛选得到的,这个函数会对每个项目返回真或假。在Python 3中,filter()函数返回的是一个迭代器,而不是列表。

2to3工具在某些情况下会在filter()的调用周围加上list(),这样可以确保结果仍然是一个列表。如果你需要一段代码能够在Python 2和Python 3中都能运行,并且希望结果是一个列表,你也可以这样做。

3

是的。在3.x版本中,几个功能性工具(最明显的就是 filter()map())被改成返回迭代器,而不是返回序列。

撰写回答