推导式和生成器表达式有什么区别?

一句话总结区别

推导式(列表/字典/集合):一次性把所有数据造好,占内存。

生成器表达式:不提前造数据,用一个造一个,超级省内存。


1. 符号不同(一眼区分)

python 复制代码
# 列表推导式
[x for x in range(10)]    # [] → 列表

# 字典推导式
{x:x*2 for x in range(10)} # {} → 字典

# 集合推导式
{x for x in [1,2,2,3]}    # {} → 集合

# 生成器表达式
(x for x in range(10))    # () → 生成器

2. 执行方式完全不同(最重要!)

✅ 推导式:立即执行,全部生成

你写出来那一刻,所有数据已经在内存里了

python 复制代码
nums = [x for x in range(1000000)]
# 100万个数字瞬间生成 → 占内存

✅ 生成器表达式:惰性执行,用到才生成

你写出来那一刻,一个数据都没生成

只有你去遍历/取数时,它才生成一个,用完就丢。

python 复制代码
nums = (x for x in range(1000000))
# 不占内存!只有调用 next() 或 for 循环才生成

3. 内存占用天差地别

推导式

数据量越大,占内存越多。

100万条数据 = 100万条同时存在内存里。

生成器

无论多少数据,永远只占一点点内存

因为它不存储数据,只存储生成数据的规则


4. 能不能重复使用?

推导式:可以反复用

python 复制代码
lst = [1,2,3,4]
print(list(lst))  # [1,2,3,4]
print(list(lst))  # [1,2,3,4]

生成器:只能用一次!(大坑)

python 复制代码
gen = (x for x in range(4))

print(list(gen))  # [0,1,2,3]
print(list(gen))  # [] 空了!耗尽了!

5. 速度对比

  • 推导式:创建慢一点,读取快
  • 生成器:创建极快,读取逐个来

终极对比表(最好记)

特性 推导式(列表/字典/集合) 生成器表达式
符号 [] {} ()
生成方式 一次性全部生成 惰性生成(用一个造一个)
内存占用 极低
可迭代次数 无限次 只能迭代一次
支持方法 所有列表/字典/集合方法 只能迭代、next()
使用场景 数据量小、需要反复使用 数据量大、只遍历一次

最简单的记忆口诀

小数据、要复用 → 用推导式

大数据、省内存 → 用生成器


总结

  1. 推导式容器,装着所有数据。
  2. 生成器工厂,只生产,不存货。
  3. 生成器只能用一次,推导式可以无限用。
  4. 处理百万/千万级数据一定要用生成器,不然程序会卡死。

相关推荐
梅雅达编程笔记8 小时前
编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)
开发语言·人工智能·python·numpy·pandas
zhz52149 小时前
GIS项目中空间参考转换与MBTiles偏移:问题成因、解法与避坑
python·vue·gis
KaMeidebaby10 小时前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习
乱写代码10 小时前
Pydantic学习--BaseModel
python
fu159357456811 小时前
【边缘计算实战】P1:从零搭建边云任务卸载仿真实验台(Python 可复现)
数据库·python·边缘计算
蜡台11 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
智能体与具身智能12 小时前
TVA 本质内涵与核心特征(系列)
人工智能·python·智能体视觉
云雾J视界12 小时前
SST:高频变压器设计实战:铁氧体 vs 纳米晶 vs 非晶,磁性材料怎么选
python·acdc·dab·sst
第一程序员12 小时前
Rust trait 入门:把 AI 客户端抽象成可替换接口
python·rust·github
Ulyanov13 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头