关于过滤器的使用()

时间:2014-01-02 12:22:35

标签: python

我已经研究了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

我的问题:如果过滤器对象不可调用,那么它在哪里适用?

3 个答案:

答案 0 :(得分:3)

请注意:

"none" != None

文档说的是function is None

filter(None, iterable)

它假设您只需要iterablebool(item) == True

的项目

要实际提供functionfilter,通常会使用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的一部分(以及mapreduce以及functoolsitertools模块)编程范例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中返回一个迭代器。它永远不会返回可调用的。