Python Lambda、map 与 filter 练习
map 和 filter 是转换与筛选的短工具。函数足够简单,并且记住 Python 3 中它们返回惰性迭代器时,这两种工具最好用。
一行规则用 lambda
lambda 是表达式,不是语句。把短函数直接传给另一个函数时,它很方便。规则需要名字或多行代码时,用 def 定义普通函数。
double = lambda n: n * 2
print(double(4))
print((lambda a, b: a + b)(2, 3))两个小 lambda
map 转换每个元素
map(function, values) 会把函数应用到每个值。结果是惰性的,所以要用 list() 才能显示或索引。输入序列不会被修改。
nums = [1, 2, 3]
print(list(map(lambda n: n + 1, nums)))转换每个值
filter 保留匹配项
filter(predicate, values) 只保留谓词返回 True 的值。谓词应该返回布尔值。打印前先把结果转成列表。
nums = [1, 2, 3, 4]
print(list(filter(lambda n: n % 2 == 0, nums)))保留偶数值
组合 map 与 filter
从内向外读这条流水线:先筛选,再转换剩下的值。如果一行太长,就给中间结果起个名字。
nums = [1, 2, 3, 4, 5]
even = filter(lambda n: n % 2 == 0, nums)
print(list(map(lambda n: n * n, even)))先筛选,再转换
选择更易读的写法
列表推导式常用更少的符号表达同样的意思。函数已经存在时,比如 str.upper 或 len,map 和 filter 很合适。优先选择初学者能一眼读懂的版本。
names = ["latte", "tea"]
print(list(map(str.upper, names)))
print([name.upper() for name in names])两种可读写法
你的练习清单
- lambda 只用于简短、明确的规则。
- 检查 map 和 filter 结果时,用 list() 包起来。
- 从内向外阅读流水线。
- 推导式更容易扫读时,优先用推导式。
常见问题
为什么 print(map(...)) 显示的是对象?
Python 3 中 map 返回惰性迭代器。用 list() 消费这些值并显示出来。
map 比列表推导式快吗?
取决于函数和输入。简单转换的差异通常很小,可读性更重要。
filter 可以返回非布尔值吗?
它会按真值/假值判断,但返回真正的布尔值更清楚,也更不容易出错。
练习 lambda、map 与 filter
12 道题,覆盖匿名函数、惰性迭代器、筛选和可读写法。
继续阅读: