Python
基础语法
01概念
02安装
03变量
04字符串
05数
06常量与注释
07列表
08元组
09if语句
10字典
11集合
12复合数据类型对比
13推导式
14用户输入
15while循环
16函数
17类
18面向对象编程
19文件操作
20异常处理
21日期和时间
22魔术方法
23内置函数
24线程
25并发&并行
26正则表达式
27迭代器
28装饰器
29生成器
30上下文管理器
31函数式编程
32闭包
33解包
34工具库
35连接关系型数据库
36虚拟环境
37异步编程
网络爬虫
01urllib库[了解]
02requests库
03数据交换格式
04解析库
05lxml
06Beautiful Soup
07Xpath语法
08动态网页的处理
-
+
首页
13推导式
在 Python 中,**推导式(Comprehension)** 是一种简洁、高效的语法结构,用于快速创建序列(如列表、字典、集合)或生成器。它将循环、条件判断和元素处理逻辑整合到一行代码中,替代传统的for循环 +append()(或类似操作)的方式,使代码更紧凑、可读性更强,且通常具有更高的执行效率。 ## 特点 **简洁性**:用一行代码实现传统多行循环的功能,减少冗余代码。 **可读性**:逻辑清晰,一眼可看出 “从什么数据中,通过什么规则,生成什么结果”。 **高效性**:底层由 Python 解释器优化执行,通常比等价的for循环更快。 **灵活性**:支持嵌套循环和条件过滤,可处理复杂逻辑。 Python 中主要有 4 种推导式,分别对应不同的数据结构:**列表推导式**、**字典推导式**、**集合推导式**和**生成器表达式**(虽名为 “表达式”,但语法和逻辑与推导式一致,常归为同类)。 ## 列表推导式 列表推导式(List Comprehension) 列表推导式是最常用的推导式,用于快速创建列表,语法结构: ```python [表达式 for 变量 in 可迭代对象 if 条件] ``` - **表达式**:生成列表元素的计算逻辑(如x*2、str(x)等)。 - **for 变量 in 可迭代对象**:遍历可迭代对象(如列表、range、字符串等),变量是每次迭代的元素。 - **if 条件**(可选):过滤条件,仅当条件为True时,当前元素才会被纳入结果。 例如: ```python # 示例1:生成0-4的平方列表(无过滤条件) squares = [x** 2 for x in range(5)] print(squares) # 输出:[0, 1, 4, 9, 16] # 等价的传统循环 squares = [] for x in range(5): squares.append(x **2) ``` ```python # 示例2:生成1-10中的偶数列表(仅保留满足x%2==0的元素) evens = [x for x in range(1, 11) if x % 2 == 0] print(evens) # 输出:[2, 4, 6, 8, 10] ``` ```python # 示例3:提取字符串列表中长度大于3的元素 words = ["apple", "cat", "banana", "dog", "grape"] long_words = [word.upper() for word in words if len(word) > 3] print(long_words) # 输出:['APPLE', 'BANANA', 'GRAPE'](同时转为大写) ``` ```python # 示例4:将0-4的数字转为"偶数"或"奇数" number_types = ["偶数" if x % 2 == 0 else "奇数" for x in range(5)] print(number_types) # 输出:['偶数', '奇数', '偶数', '奇数', '偶数'] ``` ```python # 示例5: flatten二维列表(将[[1,2], [3,4]]转为[1,2,3,4]) matrix = [[1, 2], [3, 4], [5, 6]] flattened = [num for row in matrix for num in row] print(flattened) # 输出:[1, 2, 3, 4, 5, 6] # 等价的传统循环 flattened = [] for row in matrix: for num in row: flattened.append(num) ``` ## 字典推导式 字典推导式(Dictionary Comprehension) 字典推导式用于快速创建字典,语法结构: ```python {键表达式: 值表达式 for 变量 in 可迭代对象 if 条件} ``` - **键表达式**:生成字典的键(需满足字典键的特性:不可变、唯一)。 - **值表达式**:生成对应键的值。 - 其他部分(for循环、if条件)与列表推导式逻辑一致。 例如: ```python # 示例1:生成键为0-4,值为键的平方的字典 square_dict = {x: x** 2 for x in range(5)} print(square_dict) # 输出:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} ``` ```python # 示例2:将字典的键和值互换(需确保值是不可变的,且唯一) original = {"name": "Alice", "age": 30, "city": "Beijing"} swapped = {v: k for k, v in original.items()} print(swapped) # 输出:{'Alice': 'name', 30: 'age', 'Beijing': 'city'} ``` ```python # 示例3:保留值为偶数的键值对 numbers = {"a": 1, "b": 2, "c": 3, "d": 4} even_values = {k: v for k, v in numbers.items() if v % 2 == 0} print(even_values) # 输出:{'b': 2, 'd': 4} ``` ## 集合推导式 集合推导式(Set Comprehension) 集合推导式用于创建集合(自动去重,元素无序),语法结构: ```python {表达式 for 变量 in 可迭代对象 if 条件} ``` 语法与列表推导式类似,仅外层符号为{}(区别于列表的[]),且结果会自动去除重复元素。 例如: ```python # 示例1:生成1-9中偶数的平方集合(自动去重) even_squares = {x **2 for x in range(1, 10) if x % 2 == 0} print(even_squares) # 输出:{64, 4, 36, 16, 100}(无序,因集合特性) ``` ```python # 示例2:去除列表中的重复元素并转为大写 words = ["apple", "banana", "apple", "orange", "banana"] unique_words = {word.upper() for word in words} print(unique_words) # 输出:{'APPLE', 'BANANA', 'ORANGE'}(去重+大写) ``` ## 生成器表达式 生成器表达式(Generator Expression) 生成器表达式用于创建**生成器对象**(一种可迭代对象,具有惰性计算特性),语法结构: ```python (表达式 for 变量 in 可迭代对象 if 条件) ``` 与列表推导式的区别:外层用()(而非[]),返回的是生成器(generator),而非列表。 特性: - **惰性计算**:元素不会一次性全部生成,而是在迭代时逐个计算,节省内存(尤其适合处理大数据)。 - **可迭代一次**:生成器是 “一次性” 的,迭代结束后无法再次使用(需重新创建)。 例如: ```python # 示例1:创建生成器(生成0-4的平方) square_generator = (x** 2 for x in range(5)) print(type(square_generator)) # 输出:<class 'generator'> # 迭代生成器(获取元素) for num in square_generator: print(num, end=" ") # 输出:0 1 4 9 16 # 再次迭代(已耗尽,无输出) for num in square_generator: print(num) # 无输出 ``` **与列表推导式的内存对比**:处理大数据时,生成器表达式更优(无需一次性加载所有元素到内存)。 ```python # 列表推导式:一次性生成100万个元素,占用大量内存 large_list = [x for x in range(10**6)] # 生成器表达式:仅在迭代时生成元素,内存占用极低 large_generator = (x for x in range(10**6)) ``` ## 适合使用推导式的场景 **简单转换 / 过滤**:如将列表元素做数学运算、类型转换,或按条件筛选元素。 **快速创建序列**:替代for循环 +append()的模式,减少代码量。 **大数据处理**:用生成器表达式处理超大型数据集(避免内存溢出)。 ## 不适合使用推导式的场景 **复杂逻辑**:若表达式或条件包含多层嵌套、多步运算,推导式会变得晦涩(此时用传统循环更易读)。 **副作用操作**:推导式应专注于 “生成元素”,避免在表达式中执行带副作用的操作(如print()、修改外部变量)。 ## 性能考量 推导式的执行效率通常高于等价的for循环(因底层由 C 语言优化实现)。 对于简单逻辑,列表推导式比list(map(...))更易读(功能类似,但推导式更 Pythonic)。 ## 总结 推导式是 Python 的特色语法,通过整合循环、条件和元素处理,实现了序列创建的简洁化和高效化。核心要点: - **列表推导式**:[expr for x in iter if cond],创建列表,适合中小规模数据。 - **字典推导式**:{k: v for x in iter if cond},创建字典,支持键值对灵活生成。 - **集合推导式**:{expr for x in iter if cond},创建集合,自动去重。 - **生成器表达式**:(expr for x in iter if cond),创建生成器,适合大数据(惰性计算)。 合理使用推导式可显著提升代码质量,但需平衡简洁性与可读性 —— 复杂逻辑优先选择传统循环,避免过度嵌套。
毛林
2025年9月7日 11:45
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码