map 和 reduce 是 Python 中函数式编程 的核心工具,专门用于批量处理数据 和聚合计算,代码简洁且高效,是数据处理的常用技巧。
简单一句话区分:
- map :对每个元素单独做操作(一对一转换)
- reduce :把所有元素聚合成一个结果(多对一汇总)
一、map:批量处理每个元素
map(function, iterable)
- 作用:把指定函数应用到可迭代对象(列表、元组等)的每一个元素上
- 返回:一个 map 对象(可转列表、元组等)
1. 基础示例
python
# 需求:把列表中所有数字 ×2
nums = [1, 2, 3, 4]
# 定义处理函数
def double(x):
return x * 2
# map 批量处理
result = map(double, nums)
# 转列表查看结果
print(list(result)) # 输出: [2, 4, 6, 8]
2. 搭配 lambda 简写(最常用)
实际开发中,简单函数直接用 lambda,不用单独定义:
python
nums = [1, 2, 3, 4]
result = map(lambda x: x * 2, nums)
print(list(result)) # [2, 4, 6, 8]
3. 处理多个可迭代对象
map 可以同时处理多个列表,函数参数数量对应列表数量:
python
a = [1, 2, 3]
b = [10, 20, 30]
# 对应位置相加
result = map(lambda x, y: x + y, a, b)
print(list(result)) # [11, 22, 33]
二、reduce:聚合所有元素为一个值
reduce(function, iterable[, initializer])
- 作用:反复用函数处理前两个结果,最终把整个序列合并成一个值
- 注意:Python3 中
reduce不在内置函数里,需要从 functools 导入
1. 基础示例:列表求和
python
# 必须先导入
from functools import reduce
nums = [1, 2, 3, 4]
# 累加函数:a=上一次结果,b=当前元素
def add(a, b):
return a + b
# reduce 汇总求和
total = reduce(add, nums)
print(total) # 输出: 1+2+3+4=10
2. 搭配 lambda 简写
python
from functools import reduce
nums = [1, 2, 3, 4]
total = reduce(lambda a, b: a + b, nums)
print(total) # 10
3. 带初始值的 reduce
指定初始值,会从初始值开始计算:
python
from functools import reduce
nums = [1, 2, 3]
# 初始值=10,计算 10+1+2+3
total = reduce(lambda a,b: a+b, nums, 10)
print(total) # 16
4. 其他常用场景:求最大值
python
from functools import reduce
nums = [5, 2, 9, 1]
max_num = reduce(lambda a, b: a if a > b else b, nums)
print(max_num) # 9
三、map + reduce 组合使用(经典实战)
先批量处理(map),再汇总结果(reduce),这是大数据处理的基础思想。
示例:先把所有数字平方,再求和
python
from functools import reduce
nums = [1, 2, 3, 4]
# 1. map:每个数平方 → [1,4,9,16]
# 2. reduce:求和 → 1+4+9+16=30
result = reduce(lambda a,b: a+b, map(lambda x: x**2, nums))
print(result) # 30
四、快速对比总结
| 函数 | 作用 | 输入 → 输出 | 特点 |
|---|---|---|---|
map |
批量转换 | 多个元素 → 同数量元素 | 一对一处理 |
reduce |
聚合汇总 | 多个元素 → 单个值 | 多对一汇总 |
核心记忆口诀
- map:挨个做,不减少数量
- reduce:往一起捏,只剩一个值
总结
map用于对序列中每个元素执行相同操作,返回新序列reduce用于把序列所有元素合并成一个结果 ,需从functools导入- 两者搭配
lambda使用最简洁,是 Python 数据处理的高效写法 - 大数据中的 MapReduce 思想,就来源于这两个基础函数