Python filterfalse()和filter()过滤方法,前面用到了filter()
函数,可以基于它定义itertools
模块中的filterfalse()
函数,如下所示:
filterfalse = (lambda pred, iterable:
filter(lambda x: not pred(x), iterable)
)
基于filter()
函数定义意味着谓词函数可以是None
。函数filter(None, iterable)
返回可迭代对象中的所有真值,函数filterfalse(None, iterable)
则返回所有非真值。
>>> filter(None, [0, False, 1, 2])
>>> list(_)
[1, 2]
>>> filterfalse(None, [0, False, 1, 2])
<itertools.filterfalse object at 0x101b43a50>
>>> list(_)
[0, False]
使用filterfalse()
函数意在提高代码复用性。使用这个简洁的函数,可以方便地将输入数据分为“通过”和“舍弃”两组,而无须使用逻辑非这种繁复的表达方式。
该思想体现如下:
iter_1, iter_2 = iter(some_source), iter(some_source)
good = filter(test, iter_1)
bad = filterfalse(test, iter_2)
显然,这会包含输入数据中所有的值。test()
函数无须变动,从而避免了误用括号造成难以察觉的逻辑错误。