最近在学习python,觉得有个地方很有意思,稍作记录,方便以后查阅。
Python内建的filter()函数用于过滤序列。
简单来讲,就是针对一个序列中的每个元素,调用一个判别函数,根据函数返回的True和False(Python中的bool类型必须严格为True和False),决定是否删除这个元素。
有意思的地方正在于这个判别函数的入参。如果仅根据待筛选值即可确定是否过滤,那么直接指定函数名即可,待筛选值会作为入参传入该函数;如果筛选逻辑需要额外的参数,则使用lambda表达式返回匿名函数,作为判别函数使用。
先以一个形参为例,即_filter(x):
1、如果调用时未传入实参,则x为序列中带判别值,例如:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
运行后输出为:[1, 5, 9, 15]
2、如果筛选逻辑需要额外的参数,则使用lambda表达式返回匿名函数,例如:
def is_odd(n):
return lambda x: x % n == 1
n = 2
list(filter(is_odd(n), [1, 2, 4, 5, 6, 9, 10, 15]))
函数名也是一种变量,挺强大!