为什么foo = filter(...)返回<filter object>,而不是列表?

Mar*_*ita 55 python variables filter variable-assignment

在Python IDLE 3.5.0 shell中工作.根据我对内置"过滤器"函数的理解,它会返回列表,元组或字符串,具体取决于您传入的内容.那么,为什么下面的第一个分配工作,而不是第二个('>>>只是交互式Python提示)

>>> def greetings():
    return "hello"

>>> hesaid = greetings()
>>> print(hesaid)
hello
>>> 
>>> shesaid = filter(greetings(), ["hello", "goodbye"])
>>> print(shesaid)
<filter object at 0x02B8E410>
Run Code Online (Sandbox Code Playgroud)

Tob*_*arg 67

看看filter(function, iterable)(从这里)的python文档:

iterable的那些元素构造一个迭代器,函数返回true.

所以获得一个你必须使用的列表:

shesaid = list(filter(greetings(), ["hello", "goodbye"]))
Run Code Online (Sandbox Code Playgroud)

但这可能不是你想要的,因为它试图greetings()在输入列表的值上调用"你好" 的结果,这是行不通的.这里迭代器类型也起作用,因为在你使用它们之前不会生成结果(例如通过调用list()它).所以一开始你不会得到错误,但当你尝试做某事时shesaid它会停止工作:

>>> print(list(shesaid))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
Run Code Online (Sandbox Code Playgroud)

如果要检查列表中的哪些元素等于"hello",则必须使用以下内容:

shesaid = list(filter(lambda x: x == "hello", ["hello", "goodbye"]))
Run Code Online (Sandbox Code Playgroud)

(我将你的函数放入lambda中,参见Randy C对"正常"函数的回答)


Ran*_*ndy 7

filter希望获得一个函数及其可以迭代的内容。该函数应为iterable中的每个元素返回True或False。在您的特定示例中,您要执行的操作类似于以下内容:

In [47]: def greetings(x):
   ....:     return x == "hello"
   ....:

In [48]: filter(greetings, ["hello", "goodbye"])
Out[48]: ['hello']
Run Code Online (Sandbox Code Playgroud)

请注意,在Python 3中,可能有必要使用list(filter(greetings, ["hello", "goodbye"]))来获得相同的结果。


Ahs*_*que 5

从文档

请注意,filter(function, iterable)相当于[item for item in iterable if function(item)]

在python3中,而不是返回一个列表;过滤器,映射返回一个可迭代对象。您的尝试应该适用于 python2 但不适用于 python3

显然,您正在获取一个过滤器对象,将其设为列表。

shesaid = list(filter(greetings(), ["hello", "goodbye"]))
Run Code Online (Sandbox Code Playgroud)