这个主题考什么
- 从左到右读推导式,先找出输出表达式。
- 添加筛选条件,同时不改变结果的结构。
- 判断推导式是否已经密集到难以维护。
常见错误
- 把 if 筛选放在 for 前面,正确位置通常在后面。
- 试图在一个推导式里做多个不相关的副作用。
- 不追踪顺序,就假设嵌套推导式和嵌套循环完全一样。
样题
从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。
-
1. 小明用推导式算奶茶销量平方 [x**2 for x in range(5) if x%2==0](只算偶数天),结果是?
显示答案
答案
B. [0,4,16]解析: if 先于表达式执行,只有 0、2、4 会进入 x**2,结果是 [0, 4, 16]。先过滤,1、3 和 9 才不会出现。
-
2. 判断对错: 生成器是惰性求值的, 不会一次性算出所有元素。
显示答案
答案
A. ✅ 正确解析: 生成器只在被请求时计算下一个元素,所以百万行文件也能用固定内存处理完,不必先建列表,这就是惰性,按需取用。
-
3. 🧋 小明用字典推导式生成奶茶价格表,{k: v for k, v in [('a',1),('b',2)]} 的结果?
显示答案
答案
A. {'a':1,'b':2}解析: 每个元组解包成 k、v,推导式把它们存成键值对,得到 {'a': 1, 'b': 2}。键重复时后一个覆盖前一个,但位置仍按首次出现算。
-
4. 从订单列表里只取金额大于 20 的订单,最简洁的写法是?
显示答案
答案
D. [o for o in orders if o['price'] > 20]解析: 过滤条件要放在 for 之后,而不是表达式里:[o for o in orders if o['price'] > 20]。过滤必须写在定义 o 的子句之后;写在前面时 o 还不存在。
-
5. 🧋 小明用推导式生成奶茶销量数据,列表推导式语法:[表达式 for 变量 in 可迭代对象 if ___]
显示答案
答案
条件解析: 末尾的 if 是可选项,接收布尔表达式,只有结果为真的元素才会被收集。把条件写在 for 之前是语法错误,不会得到空列表。
-
6. 只保留偶数的平方,横线填什么关键字?
squares = [x * x for x in range(6) ____ x % 2 == 0]显示答案
答案
if解析: 末尾的 if 起过滤作用:x % 2 == 0 留下 0、2、4,在平方之前就把奇数去掉。把条件塞进表达式(x*x if ...)就必须补写 else 分支。
-
7. 把两个列表按位置配对,横线填什么函数?
pairs = [(a, b) for a, b in ____(names, prices)]显示答案
答案
zip解析: zip(names, prices) 按位置配对,长度不同时以较短者为准,因此不会出现 IndexError。zip_longest 会继续配对,缺失的一侧填 None。
-
8. 小明用推导式算平方,下面代码会打印什么?
print([x*x for x in range(4)])显示答案
答案
[0, 1, 4, 9]解析: range(4) 产出 0、1、2、3,表达式逐个平方,得到 [0, 1, 4, 9]。map 加 lambda 也能做到,但推导式更直接地表达意图。
-
9. 游戏只把列表中的偶数值翻倍。会打印什么?
nums = [1, 2, 3, 4] print([n * 2 for n in nums if n % 2 == 0])显示答案
答案
[4, 8]解析: 过滤条件留下偶数 2 和 4,表达式把它们翻倍成 4 和 8;奇数根本不会进入表达式,这就是先筛后算,筛子在前。
-
10. 从三个数中取两个的组合,结果是什么?
from itertools import combinations print(list(combinations([1, 2, 3], 2)))显示答案
答案
[(1, 2), (1, 3), (2, 3)]解析: combinations(..., 2) 取两个元素且不计顺序,所以 (1,2) 只出现一次,(2,1) 不会出现。
常见问题
什么时候不该用推导式?
需要多条语句、复杂错误处理或副作用时,普通循环更容易读和调试。
推导式可以返回生成器吗?
生成器表达式使用圆括号而不是方括号,会惰性产生值。
继续保持练习节奏。
完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。