进阶特性 · 10 道样题

Python 列表推导式练习题与答案

推导式把循环、表达式和筛选压进一行。语法很紧凑,但初学者真正需要慢下来读的,是 for 和 if 子句的顺序。

40 道题在完整题库中 · 13 道选择 · 11 道填空 · 16 道输出

这个主题考什么

  • 从左到右读推导式,先找出输出表达式。
  • 添加筛选条件,同时不改变结果的结构。
  • 判断推导式是否已经密集到难以维护。

常见错误

  • 把 if 筛选放在 for 前面,正确位置通常在后面。
  • 试图在一个推导式里做多个不相关的副作用。
  • 不追踪顺序,就假设嵌套推导式和嵌套循环完全一样。
样题

样题

10

从完整题库中挑出的 10 道代表题。先自己作答,再展开答案。

  1. 选择题q1251

    1. 小明用推导式算奶茶销量平方 [x**2 for x in range(5) if x%2==0](只算偶数天),结果是?

    1. [0,1,4,9,16]
    2. [0,4,16]
    3. [0,4]
    4. [1,9]
    显示答案

    答案

    B. [0,4,16]

    解析: if 先于表达式执行,只有 0、2、4 会进入 x**2,结果是 [0, 4, 16]。先过滤,1、3 和 9 才不会出现。

  2. 选择题q1259

    2. 判断对错: 生成器是惰性求值的, 不会一次性算出所有元素。

    1. ✅ 正确
    2. ❌ 错误
    显示答案

    答案

    A. ✅ 正确

    解析: 生成器只在被请求时计算下一个元素,所以百万行文件也能用固定内存处理完,不必先建列表,这就是惰性,按需取用。

  3. 选择题q1263

    3. 🧋 小明用字典推导式生成奶茶价格表,{k: v for k, v in [('a',1),('b',2)]} 的结果?

    1. {'a':1,'b':2}
    2. ['a',1,'b',2]
    3. [('a',1),('b',2)]
    4. {'a','b'}
    显示答案

    答案

    A. {'a':1,'b':2}

    解析: 每个元组解包成 k、v,推导式把它们存成键值对,得到 {'a': 1, 'b': 2}。键重复时后一个覆盖前一个,但位置仍按首次出现算。

  4. 选择题q1280

    4. 从订单列表里只取金额大于 20 的订单,最简洁的写法是?

    1. [o if o['price'] > 20]
    2. for o in orders > 20
    3. {o for o in orders}
    4. [o for o in orders if o['price'] > 20]
    显示答案

    答案

    D. [o for o in orders if o['price'] > 20]

    解析: 过滤条件要放在 for 之后,而不是表达式里:[o for o in orders if o['price'] > 20]。过滤必须写在定义 o 的子句之后;写在前面时 o 还不存在。

  5. 填空题q1262

    5. 🧋 小明用推导式生成奶茶销量数据,列表推导式语法:[表达式 for 变量 in 可迭代对象 if ___]

    显示答案

    答案

    条件

    解析: 末尾的 if 是可选项,接收布尔表达式,只有结果为真的元素才会被收集。把条件写在 for 之前是语法错误,不会得到空列表。

  6. 填空题q1275

    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. 填空题q1279

    7. 把两个列表按位置配对,横线填什么函数?

    pairs = [(a, b) for a, b in ____(names, prices)]
    显示答案

    答案

    zip

    解析: zip(names, prices) 按位置配对,长度不同时以较短者为准,因此不会出现 IndexError。zip_longest 会继续配对,缺失的一侧填 None。

  8. 输出预测q1252

    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. 输出预测q1266

    9. 游戏只把列表中的偶数值翻倍。会打印什么?

    nums = [1, 2, 3, 4]
    print([n * 2 for n in nums if n % 2 == 0])
    显示答案

    答案

    [4, 8]

    解析: 过滤条件留下偶数 2 和 4,表达式把它们翻倍成 4 和 8;奇数根本不会进入表达式,这就是先筛后算,筛子在前。

  10. 输出预测q1271

    10. 从三个数中取两个的组合,结果是什么?

    from itertools import combinations
    print(list(combinations([1, 2, 3], 2)))
    显示答案

    答案

    [(1, 2), (1, 3), (2, 3)]

    解析: combinations(..., 2) 取两个元素且不计顺序,所以 (1,2) 只出现一次,(2,1) 不会出现。

常见问题

什么时候不该用推导式?

需要多条语句、复杂错误处理或副作用时,普通循环更容易读和调试。

推导式可以返回生成器吗?

生成器表达式使用圆括号而不是方括号,会惰性产生值。

继续保持练习节奏。

完整题库会在这个浏览器里记住进度,支持按主题筛选,并包含每日一题和错题重练。

打开完整练习