3.4 列表推导式与生成器
列表推导式
列表推导式(List Comprehension)是 Python 中一种简洁且高效的创建列表的方式。它允许你通过一行代码生成一个新的列表,而不需要使用传统的 for 循环和 append 方法。
基本语法:
[expression for item in iterable if condition]
expression:生成列表元素的表达式。item:迭代变量,表示可迭代对象中的每个元素。iterable:可迭代对象,如列表、元组、字符串等。condition:可选的条件表达式,用于过滤元素。
示例:
# 生成一个包含 1 到 10 的平方的列表
squares = [x**2 for x in range(1, 11)]
print(squares) # 输出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 生成一个包含偶数的列表
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) # 输出: [2, 4, 6, 8, 10]
嵌套列表推导式: 列表推导式可以嵌套使用,以生成更复杂的列表结构。
示例:
# 生成一个 3x3 的矩阵
matrix = [[i + j for j in range(3)] for i in range(3)]
print(matrix) # 输出: [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
生成器
生成器(Generator)是 Python 中一种特殊的迭代器,它允许你按需生成值,而不是一次性生成所有值。生成器使用 yield 关键字来返回值,并且在每次调用时从上次暂停的地方继续执行。
基本语法:
def generator_function():
yield expression
示例:
# 生成一个简单的生成器
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
生成器表达式: 生成器表达式与列表推导式类似,但它使用圆括号而不是方括号,并且返回一个生成器对象。
示例:
# 生成一个生成器表达式
gen_expr = (x**2 for x in range(1, 11))
print(next(gen_expr)) # 输出: 1
print(next(gen_expr)) # 输出: 4
生成器的优势:
- 内存效率:生成器按需生成值,不需要一次性存储所有值,因此在处理大数据集时非常高效。
- 惰性求值:生成器只在需要时计算值,适合处理无限序列或大规模数据流。
示例:
# 生成一个无限序列的生成器
def infinite_sequence():
num = 0
while True:
yield num
num += 1
gen = infinite_sequence()
print(next(gen)) # 输出: 0
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
列表推导式与生成器的比较
| 特性 | 列表推导式 | 生成器 |
|---|---|---|
| 内存使用 | 一次性生成所有值,占用较多内存 | 按需生成值,内存效率高 |
| 适用场景 | 适合小规模数据 | 适合大规模数据或无限序列 |
| 语法 | 使用方括号 [] | 使用圆括号 () 或 yield |
| 返回值 | 返回列表 | 返回生成器对象 |
总结: 列表推导式和生成器都是 Python 中强大的工具,用于高效地处理和生成数据。列表推导式适合处理小规模数据,而生成器则更适合处理大规模数据或需要惰性求值的场景。根据具体需求选择合适的工具,可以显著提高代码的效率和可读性。
