专项练习 · 7 分钟阅读

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])

两种可读写法

你的练习清单

常见问题

为什么 print(map(...)) 显示的是对象?

Python 3 中 map 返回惰性迭代器。用 list() 消费这些值并显示出来。

map 比列表推导式快吗?

取决于函数和输入。简单转换的差异通常很小,可读性更重要。

filter 可以返回非布尔值吗?

它会按真值/假值判断,但返回真正的布尔值更清楚,也更不容易出错。

练习 lambda、map 与 filter

12 道题,覆盖匿名函数、惰性迭代器、筛选和可读写法。

打开练习

继续阅读: