Python 为什么不是';它不是过滤器(不是无,是可过滤的)?

Python 为什么不是';它不是过滤器(不是无,是可过滤的)?,python,python-3.x,Python,Python 3.x,既然filter()的定义是返回函数返回True的元素列表,那么filter(not None,iterable)对只包含非NoneType项的列表进行筛选是否更有意义 是的,你只需要把它变成一个函数 filter(lambda x: x is not None, iterable) 如果function为None,则假定identity函数,即删除iterable中所有为false的元素 换句话说,在第一个参数中传递None是一种特殊情况。将删除所有假y值 然而,这并不意味着你所说的。通常

既然
filter()
的定义是返回函数返回
True
的元素列表,那么
filter(not None,iterable)
对只包含非
NoneType
项的列表进行筛选是否更有意义

是的,你只需要把它变成一个函数

filter(lambda x: x is not None, iterable)

如果function为None,则假定identity函数,即删除iterable中所有为false的元素

换句话说,在第一个参数中传递
None
是一种特殊情况。将删除所有假y值

然而,这并不意味着你所说的。通常,
filter
需要一个可调用的<代码>非无是可调用的。它本身就是
True
您可以使用:

lambda x: x is not None

非无
仅为
。正确的语法应该是

filter(lambda x: x is not None, iterable)
这对于您尝试执行的操作是有效的,但实际上并不是
filter(None,iterable)
所做的

过滤器(None,iterable)
是一种特殊情况。当
filter
看到一个
None
的筛选器谓词时,它将用标识谓词
lambda x:x
替换该谓词。它过滤掉iterable中在布尔上下文中被视为false的任何对象。也就是说

filter(None, [None, 0, 1, 2])
过滤掉
None
0
,而不仅仅是
None

因为
filter()
的定义是返回 函数返回True

但是
notnone
是一个not函数,因此不可调用
None
用作标识谓词(不仅仅是函数)的简写,在本例中,标识谓词可以是
lambda x:bool(x)
或简单的
bool
。因此,与你的建议不同,你会:

filter(lambda x: x is not None, iterable)
更重要的是,
None
速记是一种应用于python中其他一些内置函数的泛化:
map
itertools.ifilter
itertools.imap
itertools.ifilterfalse

pythonic版本的
过滤器(文档中的迭代器版本)将如下所示:

def filter(predicate, iterable):
    # filter(lambda x: x%2, range(10)) --> 1 3 5 7 9
    if predicate is None:
        predicate = bool # evaluates truth value of the object
    for x in iterable:
        if predicate(x):
            yield x 
对于python3,您不需要使用lambda,
None.\u______
只过滤None:


通过简单的旧操作顺序来考虑,<代码>不是NO.<代码>评估为<代码> true <代码>,因此您正在真正地评估<代码>筛选器(true,Itdiable)< /C>。可以理解,这会导致错误
“bool”对象不可调用
过滤器(lambda x:x,iterable)
有什么问题?而且,FWIW,您不需要
过滤器
(如果x不是无,那么iterable中的x代表x)
它不是返回
True的函数(注意大写和固定宽度字体),而是“返回true的函数”。也就是说,
filter
被松散地定义为
def filter(fn,iterable):result=[];对于iterable中的i:if fn(i):result.append(i)
。我们关心的是“真实性”,即
bool(fn(i))
会说什么。@muratgu:
filter(lambda x:x,iterable)
filter相同(None,iterable)
并丢弃空字符串、其
\uuubool\uuuuu
返回
False
的实例,依此类推。
过滤器(None,['a',''c'])
过滤器(λx:x不是无,['a','c'])
。(注意:这些是Python2的例子;Python3
filter
产生一个
)也会过滤掉
'
,对吗?
lambda x:x
本身就意味着什么吗?我不确定我是否理解。不过,如果我们谈论的是真实值,如果它是
filter(真的,iterable)会更有意义吗
?不,因为
True
不是一个函数,它是一个布尔文字。它没有任何意义。@cafeKaze:它也会过滤掉
lambda x:x
是一个只返回其参数的函数。至于
过滤器(True)
,其思想是
是“无函数”“,并不是说我们在过滤掉那些看起来像
None
@juanpa.arrivillaga的东西。呃,
None
的特例没有多大意义。我怀疑如果在Python的开发后期引入了
filter
,这种特例是否会存在。”。(
lambda x:x是真的
也不会产生当前的行为,但是如果我们要讨论设计
过滤器的假设的其他方法
的奇怪的特例,没有必要限制我们自己的当前行为。)这似乎有点违反直觉-它不能像
过滤器那样简单吗(lambda x:x是真的,iterable)
?我可以知道您所指的其他内置函数吗?但是使用
过滤器(lambda x:x是真的,iterable)
,很多事情很容易出错:
'cafeKaze'是真的->假的
过滤器(bool,iterable)更容易推广
.Koledoy不会
筛选(lambda x:x不是None,iterable)
在这种情况下也不正确吗?
0不是None->False
我建议将其作为建议的替代,而不是一般形式。请记住,
None
形式只是一种简写。
In [1]: list(filter(None.__ne__, [None, 0, 1, 2]))
Out[1]: [0, 1, 2]