在Python开发中,map和filter是两个非常实用的内置函数,它们属于函数式编程工具,能够让我们以更简洁的方式处理序列数据,比如列表、元组等。理解它们的使用方式,有助于写出可读性更高且更Pythonic的代码。

map函数的基本用法
map函数的作用是将一个函数依次应用到可迭代对象的每一个元素上,并返回一个map对象(可迭代)。其基本语法为:map(function, iterable)。我们通常会用list把它转换成列表查看结果。
# 将列表中每个数字平方
nums = [1, 2, 3, 4]
result = map(lambda x: x * x, nums)
print(list(result)) # 输出 [1, 4, 9, 16]
# 使用普通函数
def add_one(n):
return n + 1
print(list(map(add_one, [10, 20, 30]))) # 输出 [11, 21, 31]
filter函数的基本用法
filter函数用于过滤序列,保留使函数返回值为True的元素。语法为:filter(function, iterable),同样返回filter对象。它非常适合从数据中筛出满足条件的部分。
# 筛选偶数 nums = [1, 2, 3, 4, 5, 6] even = filter(lambda x: x % 2 == 0, nums) print(list(even)) # 输出 [2, 4, 6] # 筛选非空字符串 words = ['', 'hello', '', 'world'] not_empty = filter(lambda s: s != '', words) print(list(not_empty)) # 输出 ['hello', 'world']
map与filter的区别
虽然二者都处理可迭代对象,但目的不同:map侧重转换,filter侧重筛选。下面用表格说明主要差异。
| 函数 | 作用 | 返回值特点 |
|---|---|---|
| map | 对每个元素执行函数并收集结果 | 元素数量与原序列一致 |
| filter | 按条件保留元素 | 元素数量可能少于原序列 |
组合使用的例子
在实际场景中,我们可以先filter再map,或者反过来。例如从数字中挑出正数并求平方:
data = [-3, -1, 2, 4, -5, 6] positive_sq = map(lambda x: x * x, filter(lambda x: x > 0, data)) print(list(positive_sq)) # 输出 [4, 16, 36]
使用建议
对于简单逻辑,map和filter配合lambda很方便;如果逻辑复杂,建议写成具名函数以保证清晰。此外,Python的列表推导式也能实现类似功能,例如[x*x for x in data if x > 0],读者可按团队规范选择。
注意:map和filter返回的是惰性求值对象,只能遍历一次,若需多次使用请转成list。