Python 列表推导式与生成器表达式的高阶玩法
【摘要】 在 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)