推导式与生成器表达式
列表推导式
列表推导式是创建列表的简洁方式,它可以在一行代码中完成循环和条件判断。
# 基本语法
squares = [x**2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件过滤
evens = [x for x in range(20) if x % 2 == 0]
print(evens) # 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 带条件表达式
labels = ["偶数" if x % 2 == 0 else "奇数" for x in range(5)]
print(labels) # 输出: ['偶数', '奇数', '偶数', '奇数', '偶数']
字典推导式
字典推导式用于创建字典,语法与列表推导式类似。
# 基本字典推导式
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 带条件过滤
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 从两个列表创建字典
keys = ['name', 'age', 'city']
values = ['张三', 25, '北京']
person = {k: v for k, v in zip(keys, values)}
print(person) # 输出: {'name': '张三', 'age': 25, 'city': '北京'}
集合推导式
集合推导式用于创建集合,自动去除重复元素。
# 基本集合推导式
unique_squares = {x**2 for x in [-2, -1, 0, 1, 2]}
print(unique_squares) # 输出: {0, 1, 4}
# 去除重复元素
words = ['hello', 'world', 'hello', 'python', 'world']
unique_words = {word.lower() for word in words}
print(unique_words) # 输出: {'hello', 'world', 'python'}
# 从字符串中提取唯一字符
text = "hello world"
unique_chars = {char for char in text if char.isalpha()}
print(unique_chars) # 输出: {'h', 'e', 'l', 'o', 'w', 'r', 'd'}
生成器表达式
生成器表达式与列表推导式语法相似,但使用圆括号,返回生成器对象。
# 基本生成器表达式
squares_gen = (x**2 for x in range(10))
print(type(squares_gen)) # 输出: <class 'generator'>
# 使用生成器表达式
total = sum(x**2 for x in range(10))
print(total) # 输出: 285
# 惰性求值
large_gen = (x**2 for x in range(1000000))
print(next(large_gen)) # 输出: 0
print(next(large_gen)) # 输出: 1
嵌套推导式
推导式可以嵌套使用,处理多维数据。
# 嵌套列表推导式
matrix = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(matrix) # 输出: [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
# 扁平化嵌套列表
nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for sublist in nested for num in sublist]
print(flat) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 带条件的嵌套推导式
even_nested = [[num for num in sublist if num % 2 == 0]
for sublist in nested]
print(even_nested) # 输出: [[2], [4, 6], [8]]
推导式与函数的对比
推导式通常比等效的for循环更简洁高效。
# 使用for循环
squares_loop = []
for x in range(10):
if x % 2 == 0:
squares_loop.append(x**2)
# 使用推导式(更简洁)
squares_comp = [x**2 for x in range(10) if x % 2 == 0]
print(squares_loop == squares_comp) # 输出: True
# 性能对比
import timeit
# for循环方式
def loop_method():
result = []
for x in range(1000):
if x % 2 == 0:
result.append(x**2)
return result
# 推导式方式
def comprehension_method():
return [x**2 for x in range(1000) if x % 2 == 0]
# 推导式通常更快
loop_time = timeit.timeit(loop_method, number=1000)
comp_time = timeit.timeit(comprehension_method, number=1000)
print(f"循环: {loop_time:.4f}s, 推导式: {comp_time:.4f}s")
最佳实践
- 推导式适合简单的转换和过滤操作
- 复杂逻辑应该使用普通的for循环,保持代码可读性
- 避免过度嵌套推导式,一般不超过两层
- 使用生成器表达式处理大数据集,节省内存
- 当需要多个条件时,考虑使用
all()或any()函数 - 为推导式添加适当的空格,提高可读性
推导式是Python的特色语法之一,掌握它能让你的代码更加简洁优雅。