我已经研究了python的内置函数一段时间了,我试图牢牢掌握理想的情况,以便以后应用它们。我已经了解了除filter()之外的所有内容,参数为filter(function, iterable)
。在docs.python.org中,它声明:
如果function为None,则假定为identity函数,即删除所有可迭代的false元素。
我决定解决这个问题,因为我没有掌握什么功能要求(显然,它需要一个功能;但是,什么样的?)这是尝试过的:
a=filter(None,[1,0,1,0,1,0])
<filter object at 0x02898690>
callable(a)
False
我的问题:如果过滤器对象不可调用,那么它在哪里适用?
答案 0 :(得分:3)
请注意:
"none" != None
文档说的是function is None
:
filter(None, iterable)
它假设您只需要iterable
中bool(item) == True
。
要实际提供function
到filter
,通常会使用lambda
:
filter(lambda x: x > 5, iterable)
或定义一个函数:
def some_func(x):
return x > 5
filter(some_func, iterable)
filter
对象不可调用,但可以迭代:
a = filter(None, iterable)
for item in a:
print item
答案 1 :(得分:1)
使用示例:
>>> list(filter(None, [0, 1, 2, 0, 3, 4, 5, "", 6, [], 7, 8]))
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> def is_multiple_of_two_or_three(x):
return x % 2 == 0 or x % 3 == 0
>>> list(filter(is_multiple_of_two_or_three, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
[0, 2, 3, 4, 6, 8, 9]
使用lambda
关键字,我们可以将其写为list(filter(lambda x: x%3 == 0 or x%2 == 0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
。
在Python 2.x中,如果我们删除了对list
的调用,我们会得到相同的结果。在Python 3.x中,我们可以使用for i in filter(None, something)
迭代一个没有它的过滤器对象,但我调用list
来显示结果(迭代的字符串表示通常不是有用)。
函数filter
是Python的一部分(以及map
,reduce
以及functools
和itertools
模块)编程范例functional programming。
答案 2 :(得分:0)
函数可以是任何python函数:
def
基于函数:
def func(x):
return x != 0
>>> list(filter(func, [1,0,1,0,1,0]))
[1, 1, 1]
lambda
:
>>> list(filter(lambda x: x!=0, [1,0,1,0,1,0]))
[1, 1, 1]
在Python3 filter
中返回一个迭代器。它永远不会返回可调用的。