Python 生成器(Generator)
·
一、什么是生成器?
一句话定义
生成器 = 一边循环一边计算的迭代器,不用一次性创建所有数据
- 它是一个函数 / 表达式,可以暂停执行并返回值
- 下次调用时,从暂停位置继续执行
- 不占用大量内存,只在需要时生成一个数据
核心特点
- 惰性计算:用到才生成,不用不生成
- 节省内存:百万级数据也不卡顿
- 只能迭代一次
- 本质是迭代器,可以用
for遍历
二、两种创建生成器的方式
1)最简单:生成器表达式(一行搞定)
把列表推导式的 [] 换成 () 就是生成器!
# 列表(一次性创建所有数据)
my_list = [x for x in range(5)]
print(my_list) # [0,1,2,3,4]
# 生成器(边循环边生成)
my_gen = (x for x in range(5))
print(my_gen) # <generator object>
2)最常用:生成器函数(带 yield)
函数里出现 yield → 自动变成生成器
def gen():
yield 1 # 暂停,返回 1
yield 2 # 暂停,返回 2
yield 3 # 暂停,返回 3
g = gen() # 创建生成器对象
三、生成器怎么用?
方法 1:next () 手动调用
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
print(next(g)) # 报错 StopIteration(无数据了)
方法 2:for 循环(最常用,自动处理结束)
for num in gen():
print(num)
# 输出 1 2 3
方法 3:转列表(一次性取出所有)
print(list(gen())) # [1,2,3]
四、yield 关键字(生成器灵魂)
yield 作用
- 返回值
- 暂停函数执行
- 下次调用从暂停位置继续
对比 return:
- return:结束函数
- yield:暂停函数,保留状态
五、生成器最大优势:省内存!
场景:生成 1 亿个数字
- 列表:占用 几百 MB 内存
- 生成器:占用 几 KB 内存
# 列表(卡死!)
# big_list = [x for x in range(100000000)]
# 生成器(丝滑!)
big_gen = (x for x in range(100000000))
生成器永远只存一个数据。
六、生成器实战案例
案例 1:无限序列(永不结束)
def infinite():
n = 0
while True:
yield n
n += 1
g = infinite()
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 2
案例 2:斐波那契数列(经典)
def fib(n):
a, b = 0, 1
for _ in range(n):
yield b
a, b = b, a + b
# 取前 10 个斐波那契数
for num in fib(10):
print(num, end=" ")
案例 3:读取超大文件(不会爆内存)
逐行读取,不一次性加载整个文件:
def read_big_file(file_path):
with open(file_path, 'r') as f:
for line in f:
yield line
七、高级用法:send () 传值进生成器
可以外部给生成器传数据!
def gen():
val = yield "start"
print(f"收到:{val}")
yield "end"
g = gen()
print(next(g)) # start
print(g.send(66)) # 收到:66 → end
八、生成器执行流程(必懂)
调用生成器函数 → 创建对象
next() → 执行到 yield → 返回值 → 暂停
next() → 从暂停处继续 → 到下一个 yield
无 yield → 抛出 StopIteration
九、生成器 VS 列表 对比
| 特性 | 列表 list | 生成器 generator |
|---|---|---|
| 内存 | 占用大 | 占用极小 |
| 计算方式 | 一次性生成 | 惰性计算 |
| 访问 | 可重复、可索引 | 只能迭代一次 |
| 速度 | 小数据快 | 大数据快 |
小数据用列表,大数据用生成器!
十、一句话总结(背会就精通)
- 生成器 = 带 yield 的函数 / () 推导式
- yield = 暂停 + 返回值
- 惰性计算,省内存
- 处理大数据、无限序列、大文件首选
- 迭代一次,不能回头
最强万能模板
def my_generator():
# 初始化
while 条件:
# 计算数据
yield 数据 # 生成一个值更多推荐



所有评论(0)