使用filter函数的原则:
1、在编程中,应当优先使用生成式(推导式)去完成列表筛选工作
2、仅当生成式(推导式)过于复杂或难以阅读时,才使用filter(比如需要处理异常)
3、网上关于使用lambda函数来创建可调用对象作为filter的参数,以及其它一些方法,均不推荐使用,这些方法还不如直接使用生成式(推导式)
一、官方定义
filter(function, iterable)
1、filter函数构建了一个迭代器
(1)该迭代器使用【传入的function函数】对【传入的可迭代对象】进行判断,并返回True或者False
(2)该迭代器包含了返回值为True的那些元素
简单说:使用function提供筛选条件,对传入的可迭代对象进行判断,把不符合条件的对象去掉。
2、function可以为None
当为None时,使用可迭代对象本身进行True或者False的判断
【注意,必须要写None,不能省略】
例如:
print(list(filter([0, 1, 0, 2, 3])))
# 没有输入None,编译时,报异常:
# TypeError: filter expected 2 arguments, got 1
print(list(filter(None,[0, 1, 0, 2, 3])))
# 返回:[1, 2, 3]
3、filter(function, iterable)完全等价于生成器表达式
(item for item in iterable if function(item))
if function is not None
and (item for item in iterable if item)
if function is None
.
二、在筛选条件中,处理异常,需要用到filter()
以下例子源自(python算法详解,张玲玲)
ls = ['1', '2', '-3', '-', '4', 'N/A', '5']
def value_int(val):
try:
x = int(val)
return True
except ValueError:
return False
ls_after = list(filter(value_int, ls))
print(ls_after)