map()、filter() 和 reduce() 可以把数据处理拆成清晰的步骤。它们常常和短小的 lambda 函数配合使用。
数据处理流水线
可以把一组数据想成一条数据处理流水线(data pipeline):
filter():决定哪些元素留下。map():把每个元素转换成新值。reduce():把多个值合并成一个结果。
流水线检查站:filter → map → reduce
每次点击推进一个检查站,观察元素是被淘汰、转换,还是合并进累计值。
[1, 2, 3, 4, 5, 6]
等待上一步…
等待上一步…
等待上一步…
当前只显示原始数据;点击后才计算 filter奇数平方和
下面的程序计算 0 到 9 中所有奇数的平方和。
from functools import reduce
numbers = list(range(10))
print("原始列表 =", numbers)
odds = list(filter(lambda x: x % 2 == 1, numbers))
print("奇数 =", odds)
squares = list(map(lambda x: x ** 2, odds))
print("平方 =", squares)
total = reduce(lambda x, y: x + y, squares)
print("总和 =", total)原始列表 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
奇数 = [1, 3, 5, 7, 9]
平方 = [1, 9, 25, 49, 81]
总和 = 165知识测验
理解 lambda
lambda 用来创建没有函数名的短函数,语法是 lambda 参数: 表达式。冒号左边写输入参数,右边只能写一个表达式;表达式算出的值会自动返回,因此不写 return。例如 lambda x: x ** 2 与只包含 return x ** 2 的普通函数作用相同。
def square(x):
return x ** 2
square_lambda = lambda x: x ** 2
print(square(5))
print(square_lambda(5))lambda 本身是一个函数对象:可以把它赋给变量,也可以直接传给 map、filter、sorted 等需要函数参数的工具。它也可以接收多个参数,例如 lambda x, y: x + y。
适合 lambda 的是“一眼能读懂的一条规则”,例如排序键 key=lambda item: item[1]。如果逻辑需要多步、循环、异常处理或解释性名称,就应使用普通 def。简短不是目标,可读性才是。
Lambda 机器:参数进入,表达式返回
普通函数和 lambda 的核心规则相同。选择表达式,再点击输入值,看参数绑定与隐式返回。
lambda x: x ** 2知识测验
知识测验
重建奇数平方和流水线
用 filter、map 和 reduce 计算 1 到 20 中所有奇数的平方和。分别打印筛选、映射和归约三个阶段的结果。
用 lambda 按分数排序
给定 students = [("Lin", 88), ("Mia", 95), ("Bo", 76)],使用 sorted() 和 lambda 按分数从高到低排序并打印。
清洗温度数据
给定 values = [-5, 12, None, 31, 18, 45, 8]:先过滤掉 None 和不在 0–40 范围内的值,再把摄氏度转换为华氏度,最后用 reduce 求和。打印每个阶段。