3.3 Python 推导式

推导式(Comprehension)是Python中一种简洁高效的数据结构构建方式,可以替代传统的循环和条件判断组合。


目录

1. 列表推导式(List Comprehension)

2. 字典推导式(Dictionary Comprehension)

3. 集合推导式(Set Comprehension)

4. 元组推导式(Generator Expression)

5. 推导式的优缺点

优点:

缺点:

6. 使用场景

推荐使用场景:

不推荐场景:

最佳实践

总结


1. 列表推导式(List Comprehension)

作用:快速生成列表,替代 for 循环 + append()

[expression for item in iterable if condition]

特点

  • 返回一个新的列表

  • 比普通for循环更高效

  • 可以嵌套使用

示例

# 生成0-9的平方列表
squares = [x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 过滤偶数
evens = [x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]

# 嵌套推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flatten = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

2. 字典推导式(Dictionary Comprehension)

作用:快速构建字典。

{key_expr: value_expr for item in iterable if condition}

特点

  • 返回一个新的字典

  • 可以快速转换键值对

  • 支持条件过滤

示例

# 创建数字到平方的映射
square_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 交换键值对
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

# 条件过滤
filtered_dict = {k: v for k, v in original.items() if v > 1}
# {'b': 2, 'c': 3}

3. 集合推导式(Set Comprehension)

作用:快速生成不重复的集合(自动去重)。

语法

{expression for item in iterable if condition}

特点

  • 返回一个新的集合

  • 自动去重

  • 支持数学集合运算

示例

# 从列表创建集合(自动去重)
numbers = [1, 2, 2, 3, 4, 4, 5]
unique = {x for x in numbers}
# {1, 2, 3, 4, 5}

# 带条件的集合推导式
even_squares = {x**2 for x in range(10) if x % 2 == 0}
# {0, 4, 16, 36, 64}

4. 元组推导式(Generator Expression)

作用:生成惰性计算的迭代器(节省内存)。

语法

(expression for item in iterable if condition)

特点

  • 返回一个生成器对象

  • 惰性求值,节省内存

  • 只能遍历一次

示例

# 创建生成器
squares_gen = (x**2 for x in range(10))
# <generator object <genexpr> at 0x...>

# 使用生成器
for num in squares_gen:
    print(num)  # 0, 1, 4, 9, 16, 25, 36, 49, 64, 81

# 转换为元组
tuple_from_gen = tuple(x**2 for x in range(5))

5. 推导式的优缺点

优点:

  • 简洁性:用一行代码完成多行循环的工作

  • 可读性:结构清晰,意图明确

  • 性能:通常比普通循环更快

  • 功能性:支持嵌套和复杂条件

缺点:

  • 过度使用:复杂推导式会降低可读性

  • 调试困难:单行代码难以调试

  • 内存消耗:列表/字典/集合推导式会立即创建完整数据结构


6. 使用场景

推荐使用场景:

  1. 数据转换:将一种数据结构转换为另一种

    names = ['Alice', 'Bob', 'Charlie']
    lengths = [len(name) for name in names]
  2. 数据过滤:基于条件筛选数据

    numbers = [1, 2, 3, 4, 5]
    evens = [x for x in numbers if x % 2 == 0]
  3. 字典构建:快速创建字典映射

    keys = ['a', 'b', 'c']
    values = [1, 2, 3]
    my_dict = {k: v for k, v in zip(keys, values)}
  4. 集合操作:去重和集合运算

    words = ['hello', 'world', 'hello']
    unique_words = {word for word in words}
  5. 惰性计算:处理大数据集(生成器推导式)

    big_data = (process(x) for x in huge_dataset)

不推荐场景:

  1. 复杂逻辑:当表达式或条件太复杂时

  2. 多层嵌套:超过2层的嵌套推导式

  3. 副作用操作:推导式不适合用于有副作用的操作

  4. 需要多次访问:生成器推导式只能遍历一次


最佳实践

  • 保持推导式简洁,必要时拆分为多行

  • 避免在推导式中使用复杂的函数调用

  • 对于性能关键代码,可以比较推导式和普通循环的速度

  • 使用括号提高复杂推导式的可读性

# 可读性更好的多行写法
result = [
    transform(x)
    for x in data
    if condition(x)
    and another_condition(x)
]

        推导式是Python的强大特性,合理使用可以大幅提升代码的简洁性和效率,但也要注意避免过度使用导致代码难以维护。


总结

推导式类型语法适用场景
列表推导式[x for x in iterable]快速生成列表
字典推导式{k: v for k, v in iterable}快速构建字典
集合推导式{x for x in iterable}去重 + 快速生成集合
生成器推导式(x for x in iterable)惰性计算,节省内存

推荐使用场景

  • 数据预处理(如过滤、转换)。

  • 快速构建数据结构(如列表、字典、集合)。

  • 大数据处理(生成器推导式节省内存)。

不推荐场景

  • 多层嵌套 + 复杂逻辑(可读性差)。

  • 需要多次复用数据(生成器只能遍历一次)。

掌握推导式可以大幅提升 Python 编码效率! 🚀


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值