← 返回首页
🐍

推导式与生成器表达式

📂 python ⏱ 3 min 435 words

列表推导式

列表推导式是创建列表的简洁方式,它可以在一行代码中完成循环和条件判断。

# 基本语法
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")

最佳实践

推导式是Python的特色语法之一,掌握它能让你的代码更加简洁优雅。