基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Python中map、filter 和 reduce 函数的作用

知识点图片

在 Python 中,mapfilterreduce 是三个非常重要的内置函数(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 依然非常有用。
00:00
00:00