Python 推导式完全指南

发布时间:2026/7/22 4:27:36
Python 推导式完全指南 一、推导式语法结构1.1 基本组成推导式由三个核心部分组成第一部分表达式对每个元素进行的操作或计算结果这个表达式决定了最终生成的元素是什么样子。第二部分循环体遍历可迭代对象的循环语句用于取出每个元素进行处理。第三部分条件语句可选的过滤条件只有满足条件的元素才会被保留不满足条件的会被过滤掉。1.2 语法格式完整语法格式和不带条件的简化语法1.3 各部分说明表达式可以是简单的变量也可以是复杂的运算或函数调用for 变量 in 可迭代对象遍历获取每个元素if 条件可选部分用于筛选符合条件的元素1.4 代码示例完整语法带条件result, [i for i in range(10) if i % 2 0] # 结果[0, 2, 4 6, 8]简化语法不带条件result [i**2 for i in range(5)] # 结果[0, 1, 4, 9, 16]二、列表推导式2.1 基本用法# 传统方式3行 result [] for i in range(10): if i % 2 0: result.append(i) print(result) # [0, 2, 4, 6, 8] # 列表推导式1行 result [i for i in range(10) if i % 2 0] print(result) # [0, 2, 4, 6, 8]2.2 常见示例# 1. 生成1-100的奇数 odd [i for i in range(1, 100) if i % 2] print(odd) # [1, 3, 5, ..., 99] # 2. 平方数列表 squares [i**2 for i in range(10)] print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 3. 字符串处理 words [hello, world, python] upper_words [word.upper() for word in words] print(upper_words) # [HELLO, WORLD, PYTHON] # 4. 带条件过滤 numbers [1, 2, 3, 4, 5, 6, 7, 8] even [x for x in numbers if x % 2 0] print(even) # [2, 4, 6, 8]2.3 多层循环# 传统方式 result [] for x in range(3): for y in range(3): result.append((x, y)) # 推导式 result [(x, y) for x in range(3) for y in range(3)] print(result) # [(0,0), (0,1), (0,2), (1,0), (1,1), ...]2.4 if-else 表达式# 先if后else在表达式中使用 result [x if x % 2 0 else -x for x in range(10)] print(result) # [0, -1, 2, -3, 4, -5, 6, -7, 8, -9] # 后置if仅过滤 result [x for x in range(10) if x % 2 0] print(result) # [0, 2, 4, 6, 8]三、元组推导式生成器元组推导式返回的是生成器对象而不是元组。# ❌ 错误这不是元组推导式 t (i for i in range(10)) # 这是生成器 print(type(t)) # class generator # ✅ 正确使用 tuple() 转换为元组 t tuple(i for i in range(10)) print(type(t)) # class tuple3.1 生成器的优势# 列表占用大量内存 lst [i for i in range(100000)] print(lst.__sizeof__()) # 较大内存 # 生成器几乎不占用内存 gen (i for i in range(100000)) print(gen.__sizeof__()) # 很小内存 # 生成器不能使用索引 # print(gen[0]) # ❌ TypeError # 只能遍历一次 for item in gen: print(item) break # 只能从头开始遍历3.2 内存对比# 列表内存占用 list_data [i for i in range(1000)] print(f列表占用: {list_data.__sizeof__()} bytes) # 生成器内存占用 gen_data (i for i in range(1000)) print(f生成器占用: {gen_data.__sizeof__()} bytes) # 输出示例 # 列表占用: 8856 bytes # 生成器占用: 112 bytes四、字典推导式字典推导式返回dict表达式必须是key: value形式。# 基本语法 {key_expression: value_expression for item in iterable if condition}4.1 基本用法# 1. 键值互换 d {a: 1, b: 2, c: 3} new_d {v: k for k, v in d.items()} print(new_d) # {1: a, 2: b, 3: c} # 2. 对值进行操作 d {a: 1, b: 2, c: 3} new_d {k: v**2 for k, v in d.items()} print(new_d) # {a: 1, b: 4, c: 9} # 3. 带条件过滤 d {a: 1, b: 2, c: 3, d: 4} new_d {k: v for k, v in d.items() if v % 2 0} print(new_d) # {b: 2, d: 4} # 4. 从列表创建字典 keys [name, age, city] values [张三, 20, 北京] d {k: v for k, v in zip(keys, values)} print(d) # {name: 张三, age: 20, city: 北京}4.2 zip() 配合使用keys [a, b, c, d] values [1, 2, 3, 4] # 传统方式 d {} for i in range(len(keys)): d[keys[i]] values[i] # 推导式 zip() d {k: v for k, v in zip(keys, values)} print(d) # {a: 1, b: 2, c: 3, d: 4}五、集合推导式集合推导式返回set表达式是单个元素自动去重。# 基本语法 {expression for item in iterable if condition}5.1 基本用法# 1. 生成集合自动去重 s {i % 3 for i in range(10)} print(s) # {0, 1, 2} # 2. 平方数集合 squares {i**2 for i in range(5)} print(squares) # {0, 1, 4, 9, 16} # 3. 带条件 s {i for i in range(10) if i % 2 0} print(s) # {0, 2, 4, 6, 8} # 4. 字符串处理 words [hello, world, python, hello] unique_lengths {len(word) for word in words} print(unique_lengths) # {5, 6}自动去重六、enumerate() 与 zip()6.1 enumerate()获取索引和值# 传统方式 names [a, b, c, d] for i in range(len(names)): print(i, names[i]) # enumerate方式推荐 for index, name in enumerate(names): print(index, name) # 推导式中使用 pairs [(i, name) for i, name in enumerate(names)] print(pairs) # [(0, a), (1, b), (2, c), (3, d)]6.2 zip()并行遍历多个序列keys [a, b, c, d] values [1, 2, 3, 4] # 传统方式 for i in range(len(keys)): print(keys[i], values[i]) # zip方式推荐 for key, value in zip(keys, values): print(key, value) # 推导式中使用 d {k: v for k, v in zip(keys, values)} print(d) # {a: 1, b: 2, c: 3, d: 4} # 多个序列 names [张三, 李四, 王五] ages [20, 22, 19] cities [北京, 上海, 广州] result [{name: n, age: a, city: c} for n, a, c in zip(names, ages, cities)] print(result)七、性能对比import time # 传统循环 vs 推导式 n 1000000 # 传统方式 start time.time() result [] for i in range(n): if i % 2 0: result.append(i) print(f循环耗时: {time.time() - start:.4f}s) # 推导式 start time.time() result [i for i in range(n) if i % 2 0] print(f推导式耗时: {time.time() - start:.4f}s) # 输出示例 # 循环耗时: 0.1234s # 推导式耗时: 0.0789s更快