Python中map、filter 和 reduce 函数的作用
在 Python 中,map、filter 和 reduce 是三个非常重要的内置函数(reduce 在 Python 3 中被移到了 functools 模块),它们主要用于函数式编程。它们的作用都是对集合(如列表、元组)中的元素进行处理,但处理的方式和目的不同。
简单的一句话总结:
map:对每个元素做同样的操作(加工)。filter:根据条件筛选元素(过滤)。reduce:将所有元素合并成一个值(归约)。
1. map(function, iterable) —— 映射
作用:
将传入的函数 function 依次作用到序列 iterable 的每一个元素上,并返回一个包含处理结果的新迭代器(Iterator)。
生活类比:
工厂流水线。原料(列表中的元素)经过机器(函数)加工,变成了成品。
语法:
python
map(函数, 序列)
示例: 将列表中的每个数字平方。
python
numbers = [1, 2, 3, 4, 5]
# 定义一个平方函数
def square(x):
return x 2
# 使用 map
result = map(square, numbers)
# 注意:Python 3 中 map 返回的是迭代器,需要转为 list 查看
print(list(result))
# 输出: [1, 4, 9, 16, 25]
# 配合 lambda 使用更简洁
print(list(map(lambda x: x 2, numbers)))
2. filter(function, iterable) —— 过滤
作用:
将序列 iterable 中的每个元素传递给函数 function 进行判断。如果函数返回 True,则保留该元素;如果返回 False,则丢弃该元素。
生活类比:
安检门。只有符合条件(没有携带违禁品)的人才能通过,其他的被拦下。
语法:
python
filter(判断函数, 序列)
示例: 筛选出列表中的偶数。
python
numbers = [1, 2, 3, 4, 5, 6]
# 定义判断偶数的函数
def is_even(x):
return x % 2 == 0
# 使用 filter
result = filter(is_even, numbers)
print(list(result))
# 输出: [2, 4, 6]
# 配合 lambda 使用
print(list(filter(lambda x: x % 2 == 0, numbers)))
3. reduce(function, iterable) —— 归约
作用:
对序列 iterable 中的元素进行累积操作。函数 function 必须接收两个参数。reduce 会先取前两个元素进行计算,然后将结果与第三个元素计算,以此类推,最终返回一个数值。
注意: 在 Python 3 中,reduce 不再是全局内置函数,需要从 functools 模块导入。
生活类比:
滚雪球。从一个小核心开始,越滚越大,最后变成一个大雪球。或者吃贪吃蛇,吃一个变长一点,最后合为一体。
语法:
python
from functools import reduce
reduce(函数, 序列)
示例: 计算列表中所有数字的和(累加)。
python
from functools import reduce
numbers = [1, 2, 3, 4]
# 定义相加函数
def add(x, y):
return x + y
# 使用 reduce
# 计算过程:
# 1. add(1, 2) -> 3
# 2. add(3, 3) -> 6
# 3. add(6, 4) -> 10
result = reduce(add, numbers)
print(result)
# 输出: 10
# 配合 lambda 使用
print(reduce(lambda x, y: x + y, numbers))
总结对比
| 函数 | 输入 | 处理逻辑 | 输出 | 长度变化 |
|---|---|---|---|---|
| map | 序列 | 加工:对每个元素应用函数 | 新的序列(迭代器) | 长度不变 |
| filter | 序列 | 筛选:保留返回 True 的元素 | 新的序列(迭代器) | 长度变短或不变 |
| reduce | 序列 | 累积:两两计算,层层递进 | 单个值 | 最终只有一个值 |
💡 最佳实践提示
虽然这三个函数很强大,但在现代 Python 开发中,列表推导式 (List Comprehension) 通常被认为更具“Python 风格”(Pythonic),因为它们可读性更强。
- 替代 map:
[x**2 for x in numbers] - 替代 filter:
[x for x in numbers if x % 2 == 0] - 替代 reduce:
通常使用直接的循环或专用函数(如sum(),max()),但在需要复杂累积逻辑时,reduce依然非常有用。