Python 列表推导式与生成器表达式的高阶玩法

举报
小草飞上天 发表于 2026/08/25 14:13:59 2026/08/25
【摘要】 在 Python 开发中,处理列表数据是家常便饭。很多新手习惯使用传统的 for 循环来过滤和转换数据,但这不仅代码冗长,执行效率也相对较低。今天我们来聊聊 Python 中极具特色的语法糖——列表推导式(List Comprehension),以及它的进阶内存优化版:生成器表达式。一、 列表推导式:一行代码搞定过滤与转换假设我们有一个包含大量整数的列表,需要筛选出所有的偶数,并将它们平方。...


在 Python 开发中,处理列表数据是家常便饭。很多新手习惯使用传统的 for 循环来过滤和转换数据,但这不仅代码冗长,执行效率也相对较低。今天我们来聊聊 Python 中极具特色的语法糖——列表推导式(List Comprehension),以及它的进阶内存优化版:生成器表达式。

一、 列表推导式:一行代码搞定过滤与转换

假设我们有一个包含大量整数的列表,需要筛选出所有的偶数,并将它们平方。

传统的 for 循环写法:

numbers = [1, 2, 3, 4, 5, 6]
result = []
for num in numbers:
    if num % 2 == 0:
        result.append(num ** 2)

使用列表推导式,只需一行代码:

result = [num ** 2 for num in numbers if num % 2 == 0]

列表推导式的底层是用 C 语言实现的,它避免了在每次循环中调用 append 方法的额外开销,执行速度通常比传统循环快 20% 到 30%。

二、 嵌套推导式:优雅地处理二维矩阵

当面对多维数据结构时,推导式依然能保持优雅。比如将一个二维矩阵展平为一维列表:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 将矩阵展平,并过滤掉大于 5 的数字
flattened = [num for row in matrix for num in row if num <= 5]
# 结果: [1, 2, 3, 4, 5]

注意嵌套推导式的执行顺序是从左到右,这与传统嵌套 for 循环的书写顺序完全一致,非常符合直觉。

三、 警惕内存刺客

虽然列表推导式很爽,但当你处理百万级甚至千万级数据时,它会瞬间吃光你的内存,因为它会一次性将所有结果加载到内存中。

此时,你只需要把方括号 [] 换成圆括号 (),它就变成了生成器表达式(Generator Expression)

# 列表推导式:立即生成完整列表,占用大量内存
list_comp = [x**2 for x in range(1000000)] 

# 生成器表达式:惰性求值,几乎不占内存
gen_exp = (x**2 for x in range(1000000)) 

生成器不会立即计算结果,而是返回一个迭代器对象。当你遍历它时,它才会按需(Yield)生成下一个值。在处理大文件读取、海量数据库查询结果时,生成器表达式是绝对的内存救星。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。