Python的filter方法
Python 的 filter() 函数是一种内置的高阶函数,用于从可迭代对象中筛选满足特定条件的元素,返回一个迭代器(Python 3 中)。以下是其核心要点:
🔧 1. 基本语法与定义
• 语法:filter(function, iterable)
• function:判断函数,返回布尔值(True/False)。若为 None,则自动过滤掉布尔值为 False 的元素(如 0、""、None、False 等)。
• iterable:可迭代对象(如列表、元组、字典)。
• 返回值:迭代器(filter 对象),需通过 list() 等转换为列表以查看结果。
⚙️ 2. 核心工作机制
• 遍历 iterable 中的每个元素,传递给 function 进行测试:
• 若 function 返回 True,保留该元素;
• 若返回 False,丢弃该元素。
示例:
筛选偶数
numbers = [1, 2, 3, 4, 5]
even = filter(lambda x: x % 2 == 0, numbers)
print(list(even)) # 输出 [2, 4]
过滤空字符串
words = [“hello”, “”, “world”]
non_empty = filter(None, words)
print(list(non_empty)) # 输出 [“hello”, “world”]
🛠️ 3. 典型应用场景
• 数据清洗:去除缺失值(None)、空字符串或无效数据。
• 条件筛选:如从用户列表中过滤成年人(age >= 18)。
• 复杂逻辑:结合 lambda 或自定义函数,如筛选质数、特定字符的字符串等。
• 链式操作:多条件过滤(嵌套 filter)。
字典处理示例:
users = [{“name”: “Alice”, “age”: 25}, {“name”: “Bob”, “age”: 17}]
adults = filter(lambda u: u[“age”] >= 18, users)
print(list(adults)) # 输出 [{“name”: “Alice”, “age”: 25}]
↔️ 4. 与列表推导式的比较
特性 filter() 列表推导式 返回值 迭代器(惰性求值) 列表(立即求值) 内存效率 更高(适合大数据) 较低(生成完整列表) 可读性 简单条件更简洁 复杂条件更清晰
示例对比:
filter 方式
filter(lambda x: x % 2 == 0, numbers)
列表推导式
[x for x in numbers if x % 2 == 0]
⚠️ 5. 注意事项
• 返回值处理:filter 返回迭代器,需显式转换为列表。
• 函数返回值:function 必须返回布尔值,否则逻辑可能出错(如返回数值 0 被视为 False)。
• 性能优化:大数据集优先用 filter(惰性计算)或生成器表达式。
💎 总结
filter() 是 Python 函数式编程的核心工具,通过简洁的语法实现数据筛选,尤其适合链式操作、大数据处理和数据清洗。结合 lambda 可提升代码简洁性,但与列表推导式相比需权衡可读性与场景需求。对于返回的迭代器对象,务必通过 list()、循环等方式处理以获取实际结果。