21.1 列表生成式(List Comprehension) - 掌握
列表生成式是一种简洁的语法,用于基于已有的可迭代对象(如列表、元组、字符串等)快速生成新的列表。它可以替代传统的 for
循环来创建列表,使代码更简洁易读。
基本语法
[表达式 for 变量 in 可迭代对象 if 条件]
- 表达式:指定每个元素在列表中的值,通常是一个运算、函数或变量。
- 变量:用于接收每次迭代的元素。
- 条件(可选):为列表生成式添加一个过滤条件,只有满足条件的元素才会包含在新列表中。
示例 1:生成平方数列表
生成 1 到 10 的平方数列表。
squares = [x ** 2 for x in range(1, 11)]
print(squares) # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
示例 2:带条件的列表生成式
生成 1 到 20 中的偶数列表。
evens = [x for x in range(1, 21) if x % 2 == 0]
print(evens) # 输出: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
示例 3:嵌套循环的列表生成式
生成一个乘法表的列表。
multiplication_table = [i * j for i in range(1, 4) for j in range(1, 4)]
print(multiplication_table) # 输出: [1, 2, 3, 2, 4, 6, 3, 6, 9]
21.2 字典生成式(Dictionary Comprehension) - 掌握
字典生成式用于基于可迭代对象生成一个新的字典。它的语法与列表生成式类似,但生成的是键值对的字典,而不是列表。
基本语法
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}
- 键表达式:生成字典中每个键的值。
- 值表达式:生成字典中每个键对应的值。
- 条件(可选):用于过滤键值对,只有满足条件的元素才会包含在字典中。
示例 1:生成数字平方的字典
生成一个字典,键为 1 到 5 的数字,值为它们的平方。
squares_dict = {x: x ** 2 for x in range(1, 6)}
print(squares_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
示例 2:使用条件的字典生成式
生成一个字典,键为 1 到 10 的数字,值为 "偶数" 或 "奇数"。
parity_dict = {x: "偶数" if x % 2 == 0 else "奇数" for x in range(1, 11)}
print(parity_dict)
# 输出: {1: '奇数', 2: '偶数', 3: '奇数', 4: '偶数', 5: '奇数', 6: '偶数', 7: '奇数', 8: '偶数', 9: '奇数', 10: '偶数'}
示例 3:字典生成式处理两个列表
使用两个列表生成字典,其中一个列表提供键,另一个提供值。
keys = ["a", "b", "c"]
values = [1, 2, 3]
combined_dict = {k: v for k, v in zip(keys, values)}
print(combined_dict) # 输出: {'a': 1, 'b': 2, 'c': 3}
21.3 元组生成式(Tuple Comprehension) - 掌握
严格来说,Python 并没有元组生成式,因为括号 ()
被优先解释为生成器表达式。但我们可以通过将生成器表达式转换为 tuple()
来实现类似元组生成式的效果。生成器表达式用于生成一个惰性求值的生成器对象,可以减少内存占用。
基本语法
(表达式 for 变量 in 可迭代对象 if 条件)
- 表达式:指定每个元素在生成器中的值。
- 变量:用于接收每次迭代的元素。
- 条件(可选):用于过滤元素,只有满足条件的元素才会包含在生成器中。
示例 1:生成平方数的元组
生成 1 到 10 的平方数元组。
squares_tuple = tuple(x ** 2 for x in range(1, 11))
print(squares_tuple) # 输出: (1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
示例 2:带条件的生成器表达式转换为元组
生成 1 到 20 的偶数元组。
evens_tuple = tuple(x for x in range(1, 21) if x % 2 == 0)
print(evens_tuple) # 输出: (2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
示例 3:生成嵌套元组
生成乘法表的嵌套元组。
multiplication_table = tuple((i, j, i * j) for i in range(1, 4) for j in range(1, 4))
print(multiplication_table)
# 输出: ((1, 1, 1), (1, 2, 2), (1, 3, 3), (2, 1, 2), (2, 2, 4), (2, 3, 6), (3, 1, 3), (3, 2, 6), (3, 3, 9))
21.4 生成式的优缺点(了解)
优点
- 简洁高效:生成式使用一行代码创建数据结构,比传统的循环和条件判断更简洁。
- 可读性高:生成式语法直观清晰,减少代码行数,提升代码的可读性。
- 节省内存:生成器表达式使用惰性求值,不会立即生成所有元素,适合处理大数据量。
缺点
- 复杂性限制:生成式适合简单的逻辑,过于复杂的表达式会降低可读性。
- 调试难度:生成式中嵌套条件判断或多重循环时,调试较为困难。
- 生成器的单次迭代:生成器表达式只能被迭代一次,需注意使用场景。