Python 内建函数列表 > Python 的内置函数 eval
Python 的内建函数 filter() 是一个非常有用的高阶函数,它用于对可迭代对象进行筛选过滤。它的基本工作原理是根据指定的函数条件,从输入的可迭代对象中筛选出符合条件的元素,返回一个迭代器对象。
def filter(fn, iterable):
'''
过滤数据
:param fn: 回调函数,返回 True 是元素保留,返回 False 时元素去除
:param iterable: 要过滤的可迭代对象
:return: 过滤后的可迭代对象
'''
详细说明
filter() 函数的语法格式为:
filter(function, iterable)
其中:
-
function是筛选条件函数,当该参数为None时,filter()会自动过滤掉可迭代对象中值为False的元素 -
iterable是待处理的可迭代对象,如列表、元组等
工作原理
filter() 会遍历 iterable 中的每个元素,并调用 function 函数进行测试:
- 对于每个元素
x,计算function(x) - 如果返回值为
True,则保留该元素 - 如果返回值为
False,则过滤掉该元素
最终返回一个包含所有保留元素的迭代器对象。如果需要列表形式的结果,可以使用 list() 进行转换。
示例应用
示例1:过滤奇数
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # 输出:[2, 4, 6]
示例2:过滤空字符串
strings = ["hello", "", "world", "", "python"]
non_empty = filter(None, strings)
print(list(non_empty)) # 输出:['hello', 'world', 'python']
示例3:使用自定义函数过滤
def is_positive(num):
return num > 0
numbers = [-5, -3, 0, 2, 4]
positives = filter(is_positive, numbers)
print(list(positives)) # 输出:[2, 4]
注意事项
-
filter()返回的是迭代器而不是列表,如果需要列表必须显式转换 - 与列表推导式相比,
filter()在可读性上有时不如列表推导式清晰 - 当过滤条件简单时,使用
filter()结合lambda会更简洁 - 在 Python 3 中,
filter()返回的是过滤器对象,而在 Python 2 中返回的是列表
性能考虑
filter() 的执行效率与列表推导式相当,但对于大型数据集,filter() 可能更节省内存,因为它返回的是迭代器而不是完整的列表。在处理大数据集时,如果需要节省内存,filter() 是更好的选择。
filter() 函数常与其他函数式编程工具如 map()、reduce() 配合使用,可以构建出简洁高效的数据处理管道。这种组合方式遵循"数据转换流水线"的设计模式,每个函数专注于完成一个特定的数据处理任务:
-
filter()负责数据筛选- 示例:从列表中筛选出偶数
numbers = [1, 2, 3, 4, 5, 6] even_numbers = filter(lambda x: x % 2 == 0, numbers) -
map()负责数据转换- 接上例,将筛选出的偶数平方
squared_evens = map(lambda x: x**2, even_numbers) -
reduce()负责数据聚合- 最后计算平方后的偶数和
from functools import reduce sum_squared = reduce(lambda x, y: x + y, squared_evens)
典型应用场景包括:
- 数据清洗流程:先过滤无效数据,再转换格式,最后汇总统计
- 日志分析:筛选特定级别的日志,提取关键信息,计算指标
- 电商数据处理:过滤已下架商品,转换价格格式,计算总销售额
这种组合的优势在于:
- 代码可读性强,每个步骤意图明确
- 内存效率高,生成器特性避免中间数据存储
- 易于维护和扩展,可以灵活调整处理步骤顺序