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的例子;Python3filter
产生一个
)也会过滤掉'
,对吗?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]