一、什么是生成器?

一句话定义

生成器 = 一边循环一边计算的迭代器,不用一次性创建所有数据

  • 它是一个函数 / 表达式,可以暂停执行并返回值
  • 下次调用时,从暂停位置继续执行
  • 不占用大量内存,只在需要时生成一个数据

核心特点

  1. 惰性计算:用到才生成,不用不生成
  2. 节省内存:百万级数据也不卡顿
  3. 只能迭代一次
  4. 本质是迭代器,可以用 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 作用

  1. 返回值
  2. 暂停函数执行
  3. 下次调用从暂停位置继续

对比 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
内存 占用大 占用极小
计算方式 一次性生成 惰性计算
访问 可重复、可索引 只能迭代一次
速度 小数据快 大数据快

小数据用列表,大数据用生成器!


十、一句话总结(背会就精通)

  1. 生成器 = 带 yield 的函数 / () 推导式
  2. yield = 暂停 + 返回值
  3. 惰性计算,省内存
  4. 处理大数据、无限序列、大文件首选
  5. 迭代一次,不能回头

最强万能模板

def my_generator():
    # 初始化
    while 条件:
        # 计算数据
        yield 数据   # 生成一个值
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐