
列表推导式List Comprehension✅ 基础语法新列表 [ 表达式 for 变量 in 可迭代对象 if 条件 ]作用快速简洁生成列表替代多行for循环是Python高频考点。1. 最简形式不带条件# 普通for循环 lst [] for i in range(5): lst.append(i*2) print(lst) # [0,2,4,6,8] # 等价列表推导式 lst [i*2 for i in range(5)] print(lst) # [0,2,4,6,8]执行顺序先循环for i in range(5)再执行表达式i*2结果放入新列表2. 带if条件筛选# 取出0~10中偶数 res [i for i in range(11) if i % 2 0] print(res) # [0, 2, 4, 6, 8, 10]if用来过滤只保留满足条件的元素3. 带if-else分支位置不一样⚠️ 重点有ifelse的时候if else写在前面表达式位置# 偶数保留原值奇数写-1 res [i if i%20 else -1 for i in range(6)] print(res) # [0, -1, 2, -1, 4, -1] 区分记忆只有if筛选[expr for x in iter if 条件]if写末尾ifelse分支[expr_if_true if 条件 else expr_false for x in iter]ifelse写最前面结合你刚才代码里的例子重点city pd.Series([未知城市 if i else i for i in city])拆解这个列表推导式# 结构 [未知城市 if i else i for i in city]for i in city遍历city序列里每一个元素变量i未知城市 if i else i分支判断如果i 空字符串取未知城市否则直接取i本身原城市名称遍历全部元素生成新列表再传给pd.Series()转为Pandas序列。等价普通for写法new_list [] for i in city: if i : new_list.append(未知城市) else: new_list.append(i) city pd.Series(new_list) 考试易错点列表推导式外层是方括号[]圆括号()是生成器表达式不是列表。if和if-else位置规则选择题高频坑可读性适合简单循环嵌套多层循环不推荐拓展双层列表推导式了解# 双重循环 res [xy for x in [1,2] for y in [10,20]] print(res) # [11,21,12,22]!DOCTYPE html html langzh-CN head meta charsetUTF-8 titlePython列表推导式 单选题自测/title style body { width: 90%; max-width: 1000px; margin: 20px auto; font-family: Microsoft Yahei, sans-serif; font-size:16px; } .q-item{ border:1px solid #e8e8e8; border-radius:8px; padding:16px; margin:15px 0; } .opt{ margin:8px 0; padding:6px 10px; cursor:pointer; border-radius:4px; } .opt:hover{ background:#f3f8ff; } .correct{ background:#d9f7be; } .wrong{ background:#ffccc7; } .ans-box{ margin-top:10px; padding:10px; background:#f5f7fa; display:none; } .title{ text-align:center; font-size:22px; font-weight:bold; margin-bottom:30px; } #score{ font-size:18px; color:#1890ff; font-weight:bold; } /style /head body div classtitlePython 列表推导式 单项选择题/div div idscore得分0 / 20/div div classq-item data-answerA p1. 列表推导式外层使用什么符号包裹/p div classoptA. 方括号 []/div div classoptB. 圆括号 ()/div div classoptC. 大括号 {}/div div classoptD. 尖括号 lt;gt;/div div classans-box 答案Abr解析[]是列表推导式()是生成器表达式{}用于字典/集合推导式。 /div /div div classq-item data-answerC p2. 代码 res [i for i in range(6)]res的结果是/p div classoptA. [1,2,3,4,5,6]/div div classoptB. [1,2,3,4,5]/div div classoptC. [0,1,2,3,4,5]/div div classoptD. 报错/div div classans-box 答案Cbr解析range(6)生成0,1,2,3,4,5列表推导式直接取出每个i放入列表。 /div /div div classq-item data-answerB p3. 执行 [i*2 for i in range(4)] 的结果是/p div classoptA. [0,2,4,6,8]/div div classoptB. [0,2,4,6]/div div classoptC. [2,4,6,8]/div div classoptD. [1,3,5,7]/div div classans-box 答案Bbr解析range(4) →0,1,2,3每个元素 ×2 → 0,2,4,6。 /div /div div classq-item data-answerD p4. 筛选写法选出0~10中所有偶数正确列表推导式是/p div classoptA. [i for i in range(11) if i%20]/div div classoptB. [if i%20 for i in range(11)]/div div classoptC. [for i in range(11) if i%20:i]/div div classoptD. [i for i in range(11) if i%20]/div div classans-box 答案Dbr解析仅做筛选时if写在末尾判断用 相等判断不能写单个。 /div /div div classq-item data-answerA p5. 代码[未知城市 if i else i for i in city]该代码属于/p div classoptA. 带if-else分支的列表推导式/div div classoptB. 普通for循环不是推导式/div div classoptC. 集合推导式/div div classoptD. 生成器/div div classans-box 答案Abr解析ifelse同时出现写在表达式位置属于分支型列表推导式就是我们城市清洗案例里的代码。 /div /div div classq-item data-answerC p6. res [i if i%20 else -1 for i in range(5)]res结果/p div classoptA. [0,1,2,3,4]/div div classoptB. [-1,-1,-1,-1,-1]/div div classoptC. [0,-1,2,-1,4]/div div classoptD. [0,1,-1,3,-1]/div div classans-box 答案Cbr解析偶数保留原值奇数替换成-1。0偶1奇2偶3奇4偶。 /div /div div classq-item data-answerB p7. 下列哪一项是列表推导式与普通for循环相比的优点/p div classoptA. 可以实现for做不到的逻辑/div div classoptB. 代码简洁紧凑一行完成简单列表生成/div div classoptC. 运行速度永远比for循环慢/div div classoptD. 支持所有复杂嵌套逻辑/div div classans-box 答案Bbr解析列表推导式只是语法糖功能等价for循环优势是代码简短适合简单逻辑。多层复杂循环不推荐。 /div /div div classq-item data-answerD p8. 表达式 (i for i in range(5)) 的类型是/p div classoptA. 列表/div div classoptB. 字典/div div classoptC. 集合/div div classoptD. 生成器表达式/div div classans-box 答案Dbr解析圆括号包裹不是列表推导式是生成器。列表推导式必须是[]。 /div /div div classq-item data-answerC p9. 生成1~10所有3的倍数正确代码是/p div classoptA. [i for i in range(1,11) if i/30]/div div classoptB. [i for i in range(1,11) if i%30]/div div classoptC. [i for i in range(1,11) if i%30]/div div classoptD. [if i%30 for i in range(1,11)]/div div classans-box 答案Cbr解析取余%等于用if筛选放在末尾。3,6,9会被筛选出来。 /div /div div classq-item data-answerA p10. 下面代码等价于哪个列表推导式brlst[]brfor i in range(4):brnbsp;nbsp;lst.append(i10)/p div classoptA. [i10 for i in range(4)]/div div classoptB. [i for i in range(4)10]/div div classoptC. [i10 if i in range(4)]/div div classoptD. [range(4),i10]/div div classans-box 答案Abr解析循环遍历range(4)每个i10追加进列表对应推导式写法。 /div /div div classq-item data-answerB p11. lst [s.upper() for s in [a,b,c]]lst结果/p div classoptA. [a,b,c]/div div classoptB. [A,B,C]/div div classoptC. [A,B,C]/div div classoptD. 报错/div div classans-box 答案Bbr解析upper()把小写字母转为大写遍历列表中每个字符串。 /div /div div classq-item data-answerD p12. 列表推导式中同时写if和else时if else应该放在哪里/p div classoptA. for的后面/div div classoptB. 整个表达式最后/div div classoptC. for循环中间/div div classoptD. for的前面/div div classans-box 答案Dbr解析有ifelse分支[ 真值表达式 if 条件 else 假值 for x in iter ]单纯if筛选才写在for后面。 /div /div div classq-item data-answerC p13. res [i for i in range(10) if i5]res的值/p div classoptA. [0,1,2,3,4,5]/div div classoptB. [5,6,7,8,9]/div div classoptC. [6,7,8,9]/div div classoptD. [10]/div div classans-box 答案Cbr解析筛选i5range(10)是0~9满足条件6,7,8,9。 /div /div div classq-item data-answerA p14. 执行代码[10 for _ in range(3)] 结果为/p div classoptA. [10,10,10]/div div classoptB. [0,1,2]/div div classoptC. [10,11,12]/div div classoptD. [3]/div div classans-box 答案Abr解析_代表不需要使用循环变量循环3次每次写入数字10。 /div /div div classq-item data-answerB p15. 对于代码new_list [未知 if i else i for i in citys]如果i等于新列表放入/p div classoptA. i原值/div div classoptB. 未知/div div classoptC. 空字符串/div div classoptD. None/div div classans-box 答案Bbr解析三元表达式规则条件i成立取if前面的值未知。 /div /div div classq-item data-answerC p16. 选出列表中大于0的数字写法正确的是/p div classoptA. [x for x in [-2,0,3,5] if x0 else 0]/div div classoptB. [if x0 else x for x in [-2,0,3,5]]/div div classoptC. [x for x in [-2,0,3,5] if x0]/div div classoptD. [x if x0 for x in [-2,0,3,5]]/div div classans-box 答案Cbr解析单纯筛选只保留大于0元素if写末尾不需要else。结果 [3,5] /div /div div classq-item data-answerD p17. 下面哪一个不适合用列表推导式编写/p div classoptA. 生成简单数字序列/div div classoptB. 批量转换字符串/div div classoptC. 简单筛选数据/div div classoptD. 多层嵌套循环大量业务逻辑/div div classans-box 答案Dbr解析复杂多层循环、大量逻辑列表推导式可读性差推荐普通for循环。 /div /div div classq-item data-answerA p18. lst [x*3 for x in [1,2,3]]lst是/p div classoptA. [3,6,9]/div div classoptB. [1,2,3]/div div classoptC. [111,222,333]/div div classoptD. [3,3,3]/div div classans-box 答案Abr解析每个元素 ×31*33,2*36,3*39。 /div /div div classq-item data-answerB p19. 列表推导式中for循环遍历的对象必须是/p div classoptA. 只能是列表/div div classoptB. 可迭代对象range、列表、Series都可以/div div classoptC. 只能是range/div div classoptD. 必须是数字/div div classans-box 答案Bbr解析可迭代对象都可以遍历range、list、字符串、pandas Series都支持。 /div /div div classq-item data-answerC p20. 下面代码执行结果 [i for i in python]/p div classoptA. [python]/div div classoptB. [p,y,t,h,o,n]/div div classoptC. [p,y,t,h,o,n]/div div classoptD. 报错/div div classans-box 答案Cbr解析字符串属于可迭代对象循环遍历每一个字符。 /div /div script let score0; const totaldocument.querySelectorAll(.q-item).length; document.querySelectorAll(.opt).forEach(opt{ opt.onclickfunction(){ const qBoxthis.closest(.q-item); const answerqBox.dataset.answer; const userSelthis.innerText[0]; qBox.querySelectorAll(.opt).forEach(o{ o.classList.remove(correct,wrong); }) if(userSel answer){ this.classList.add(correct); score; }else{ this.classList.add(wrong); //标记正确选项 qBox.querySelectorAll(.opt).forEach(o{ if(o.innerText[0] answer){ o.classList.add(correct); } }) } qBox.querySelector(.ans-box).style.displayblock; document.getElementById(score).innerText得分${score} / ${total}; } }) /script /body /html