
目录一、什么是列表推导式二、从 for 循环到列表推导式三、列表推导式的优势四、进阶用法也可以直接调用字符串方法五、与其他推导式的对比六、性能对比七、注意事项八、总结在 Python 中列表推导式List Comprehension是一种简洁而强大的构建列表的语法。它可以将多行的for循环浓缩为一行让代码更优雅、更易读同时在某些场景下还能提升性能。本文将从基础到进阶带你彻底掌握列表推导式。一、什么是列表推导式列表推导式是 Python 中用于创建新列表的一种简洁语法其基本结构如下[expression for item in iterable if condition]expression对每个元素执行的操作可以是一个表达式或函数调用item从可迭代对象中取出的元素iterable任何可迭代对象列表、元组、字符串、range 等if condition可选的过滤条件只有满足条件的元素才会参与计算二、从 for 循环到列表推导式场景 1创建平方数列表传统 for 循环3 行python squares [] for i in range(1, 6): squares.append(i ** 2) print(squares) # [1, 4, 9, 16, 25]列表推导式1 行python squares [i ** 2 for i in range(1, 6)] print(squares) # [1, 4, 9, 16, 25]场景 2过滤偶数for 循环python evens [] for num in range(10): if num % 2 0: evens.append(num) print(evens) # [0, 2, 4, 6, 8]列表推导式python evens [num for num in range(10) if num % 2 0] print(evens) # [0, 2, 4, 6, 8]三、列表推导式的优势1. 代码简洁将循环和条件逻辑压缩在一行减少代码量。2. 可读性好对于简单的映射和过滤意图一目了然。3. 执行效率高列表推导式在 CPython 中由 C 语言层实现比普通 Python 循环更快尤其是处理大量数据时。四、进阶用法1. 嵌套循环生成一个二维坐标列表python # for 循环 coords [] for x in range(3): for y in range(3): coords.append((x, y)) print(coords) # 列表推导式 coords [(x, y) for x in range(3) for y in range(3)] print(coords) 输出 [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]2. 条件表达式三元运算符在 expression部分使用 if-else来实现更复杂的逻辑python # 将偶数保留原值奇数变为负数 result [num if num % 2 0 else -num for num in range(5)] print(result) # [0, -1, 2, -3, 4]3. 多重条件过滤使用多个 if 条件进行过滤python # 找出 1-20 之间能被 2 整除且能被 3 整除的数 nums [x for x in range(1, 21) if x % 2 0 if x % 3 0] print(nums) # [6, 12, 18] # 等价于 and 连接 nums [x for x in range(1, 21) if x % 2 0 and x % 3 0]4. 使用函数或方法expression 可以是函数调用python def double(x): return x * 2 doubled [double(i) for i in range(5)] print(doubled) # [0, 2, 4, 6, 8]也可以直接调用字符串方法words [hello, world, python] upper_words [word.upper() for word in words] print(upper_words) # [HELLO, WORLD, PYTHON]五、与其他推导式的对比Python 不仅支持列表推导式还支持字典推导式{key: value for item in iterable}集合推导式{expression for item in iterable}自动去重生成器表达式(expression for item in iterable)惰性求值不占用内存示例python # 字典推导式将列表转为字典索引:值 items [a, b, c] dict_comp {i: item for i, item in enumerate(items)} print(dict_comp) # {0: a, 1: b, 2: c} # 集合推导式取平方自动去重 numbers [1, 2, 2, 3] set_comp {x**2 for x in numbers} print(set_comp) # {1, 4, 9} # 生成器表达式占用内存极小 gen (x**2 for x in range(10)) print(next(gen)) # 0 print(sum(gen)) # 285从1到9的平方和因为0已被消耗六、性能对比通过 timeit 模块测试列表推导式与普通循环的性能python import timeit # 测试创建 100 万个平方数 print(timeit.timeit([i**2 for i in range(1000000)], number10)) print(timeit.timeit( lst [] for i in range(1000000): lst.append(i**2) , number10))通常情况下列表推导式比普通 for循环快 20%~30%。七、注意事项1. 不要过度嵌套虽然列表推导式支持多层嵌套但当嵌套层数过多超过 2 层时可读性会急剧下降。此时建议使用普通循环。#不推荐 python result [x*y for x in range(10) for y in range(10) for z in range(10) if xyz 10]2. 避免副作用expression 部分应该是一个纯表达式不要在其中执行有副作用的操作如修改外部变量、打印等。如果需要就使用普通循环。python # 不要这样做 [print(i) for i in range(5)] # 虽然能打印但违反了列表推导式的初衷3. 内存占用列表推导式会立即生成整个列表如果数据量非常大例如上百万元素可能会占用大量内存。此时可考虑使用生成器表达式。python # 生成器表达式惰性求值 sum_of_squares sum(x**2 for x in range(1000000))八、总结简单的映射如 [f(x) for x in lst]列表推导式简单的过滤如 [x for x in lst if cond]列表推导式复杂逻辑、多层嵌套、副作用 普通for循环超大数据集 生成器表达式附加练习将字符串1,2,3,4,5转换为整数列表 [1,2,3,4,5]。欢迎在评论区留下你的答案如果觉得这篇文章对你有帮助欢迎点赞、收藏、关注。