适合对象:零编程基础的大一新生 课程目标:理解列表生成式的语法与优势,能用其快速生成、筛选和转换数据。
1.1 传统循环的痛点
问题:如何生成一个包含1到10平方数的列表?
传统方法:用for循环逐个计算并追加到列表。
squares = []for x in range(1, 11): squares.append(x * x)print(squares) # 输出: [1, 4, 9, 16, ..., 100]缺点:代码冗长,需手动初始化列表和追加元素。
1.2 列表生成式的魔法
解决方案:用一行代码实现相同功能。
squares = [x * x for x in range(1, 11)]print(squares) # 输出: [1, 4, 9, 16, ..., 100]核心语法:
[表达式 for 变量 in 可迭代对象]优势:简洁、高效、易读。
1.3 动手实验
任务:用列表生成式生成1到20的偶数列表。
提示:结合range的步长和if条件。
参考答案:
evens = [x for x in range(2, 21, 2)]2.1 带条件的列表生成式
语法:在for后添加if条件,仅保留满足条件的元素。
# 生成1到10中偶数的平方even_squares = [x * x for x in range(1, 11) if x % 2 == 0]print(even_squares) # 输出: [4, 16, 36, 64, 100]对比传统方法:
# 传统循环需嵌套if判断even_squares = []for x in range(1, 11):if x % 2 == 0: even_squares.append(x * x)2.2 多条件筛选
任务:筛选出1到100中能被3或5整除的数。
解决方案:
divisible_nums = [x for x in range(1, 101) if x % 3 == 0or x % 5 == 0]2.3 避坑指南
错误示例:在if后加else会报错!
# 错误写法(SyntaxError)[x for x in range(1, 11) if x % 2 == 0else0]原因:for后的if是筛选条件,不能带else。
3.1 表达式中的复杂操作
任务:将字符串列表中的每个单词转为大写。
words = ["hello", "world", "python"]upper_words = [word.upper() for word in words]print(upper_words) # 输出: ['HELLO', 'WORLD', 'PYTHON']扩展:结合条件筛选特定长度的单词。
long_words = [word.upper() for word in words if len(word) > 4]3.2 处理混合类型数据
问题:列表中包含字符串和数字,如何安全转换?
错误示例:直接对数字调用lower()会报错。
mixed_list = ["Hello", 18, "World", None]# 错误写法(AttributeError)[item.lower() for item in mixed_list]解决方案:用isinstance判断类型。
safe_lower = [item.lower() if isinstance(item, str) else item for item in mixed_list]3.3 互动练习
任务:给定一个学生成绩列表(含姓名和分数),筛选出及格(≥60)的学生姓名。
提示:假设数据格式为[("张三", 85), ("李四", 45), …]。
参考答案:
students = [("张三", 85), ("李四", 45), ("王五", 72)]passed_students = [name for name, score in students if score >= 60]4.1 两层循环生成全排列
任务:生成字母'A'、'B'与数字1、2的所有组合。
combinations = [m + str(n) for m in ["A", "B"] for n in [1, 2]]print(combinations) # 输出: ['A1', 'A2', 'B1', 'B2']对比传统方法:
# 传统循环需嵌套两层combinations = []for m in ["A", "B"]:for n in [1, 2]: combinations.append(m + str(n))4.2 字典生成式
语法:用{键表达式: 值表达式 for 变量 in 可迭代对象}生成字典。
# 将列表转为字典:元素作为键,长度作为值words = ["apple", "banana", "cherry"]word_len = {word: len(word) for word in words}print(word_len) # 输出: {'apple': 5, 'banana': 6, 'cherry': 6}4.3 综合挑战
任务:给定一个班级成绩字典(格式:{"张三": 85, "李四": 45}),生成及格学生名单及其成绩。
参考答案:
scores = {"张三": 85, "李四": 45, "王五": 72}passed = {name: score for name, score in scores.items() if score >= 60}[表达式 for 变量 in 可迭代对象 if 条件]。.txt文件并转为小写路径。课程特色:
if后加else)。