python生成器

一、生成器的核心概念

  1. 定义
    • 生成器是一种特殊的迭代器,通过yield关键字逐步生成值,而非一次性计算所有结果。
    • 两种创建方式:生成器函数(含yield的函数)和生成器表达式。
  2. 核心特点
    • 惰性求值:按需生成数据,节省内存。
    • 状态保留:每次yield后暂停,保留局部变量和状态,下次调用时继续执行。

二、生成器的创建方式

1. 生成器函数

python

复制

def count_up_to(n):
    count = 0
    while count < n:
        yield count  # 每次产生一个值后暂停
        count += 1

gen = count_up_to(3)
print(next(gen))  # 输出 0
print(next(gen))  # 输出 1

2. 生成器表达式

类似列表推导式,但用圆括号:

python

复制

gen = (x**2 for x in range(3))
print(list(gen))  # 输出 [0, 1, 4]

三、生成器的工作机制

  • 执行流程
    调用生成器函数返回生成器对象,通过next()或循环触发执行,遇到yield返回值并暂停,下次next()时恢复。
  • 终止条件
    生成器函数执行完毕(或return语句)时抛出StopIteration异常。
    示例:python复制def simple_gen(): yield 1 return “结束” # Python3.3+支持返回值 gen = simple_gen() print(next(gen)) # 输出 1 try: next(gen) except StopIteration as e: print(e.value) # 输出 “结束”

四、生成器的优势

  1. 内存高效
    无需预存全部数据,适合处理大文件或无限序列。
    示例:逐行读取大文件python复制def read_large_file(file_path): with open(file_path, ‘r’) as f: for line in f: yield line.strip()
  2. 代码简洁
    用生成器替代手动实现迭代器(__iter____next__),减少样板代码。
  3. 支持无限序列
    示例:无限斐波那契数列python复制def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b

五、进阶用法

  1. 双向通信
    使用.send(value)向生成器发送数据:python复制def interactive_gen(): while True: value = yield # 接收外部发送的值 yield value * 2 gen = interactive_gen() next(gen) # 启动生成器(执行到第一个yield) print(gen.send(10)) # 发送10,输出20
  2. 协程与任务调度
    生成器可用于实现简单的协程,结合yield暂停/恢复执行,处理异步逻辑。

六、常见问题与注意点

  1. 单次遍历
    生成器只能迭代一次,若需重用需重新创建对象。
  2. 性能权衡
    生成器的延迟计算可能增加CPU时间,需根据场景选择。

七、总结

  • 适用场景:大数据流处理、无限序列、内存优化、协程实现。
  • 关键选择:当内存限制严格或需按需计算时,优先使用生成器。

通过理解生成器的惰性求值机制和状态保存特性,可以更高效地处理迭代任务,提升代码性能和可维护性。


评论

《“python生成器”》 有 1 条评论

  1. 您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注