当前位置:首页 > Python > 正文

Python生成器入门指南(从零理解yield、生成器表达式与迭代器)

在学习 Python生成器 的过程中,很多初学者会感到困惑:什么是生成器?它和普通函数有什么区别?为什么说它能节省内存?别担心!本教程将用通俗易懂的方式带你一步步掌握 生成器表达式yield关键字 以及它与 迭代器与生成器 的关系。

Python生成器入门指南(从零理解yield、生成器表达式与迭代器) Python生成器 生成器表达式 yield关键字 迭代器与生成器 第1张

一、什么是生成器?

生成器(Generator)是 Python 中一种特殊的迭代器。它不像列表或元组那样一次性把所有数据加载到内存中,而是“按需生成”——每次调用时才计算下一个值。这种特性让它在处理大量数据时非常高效,尤其适合内存受限的场景。

二、yield 关键字:生成器的核心

普通函数使用 return 返回结果后就结束运行了。而生成器函数使用 yield 来“产出”一个值,并暂停执行,等待下一次被调用时从暂停处继续。

来看一个简单例子:

def simple_generator():    yield 1    yield 2    yield 3# 创建生成器对象gen = simple_generator()# 逐个获取值print(next(gen))  # 输出: 1print(next(gen))  # 输出: 2print(next(gen))  # 输出: 3# print(next(gen))  # 抛出 StopIteration 异常  

注意:每次调用 next(),生成器就会执行到下一个 yield 语句并返回值。当没有更多 yield 时,会抛出 StopIteration 异常。

三、生成器表达式:更简洁的写法

除了用函数定义生成器,Python 还支持类似列表推导式的“生成器表达式”。它的语法几乎一样,只是用圆括号 () 而不是方括号 []

# 列表推导式(一次性创建整个列表)squares_list = [x**2 for x in range(5)]# 生成器表达式(按需生成)squares_gen = (x**2 for x in range(5))print(type(squares_list))  # <class 'list'>print(type(squares_gen))   # <class 'generator'># 遍历生成器for val in squares_gen:    print(val)# 输出: 0, 1, 4, 9, 16  

虽然两者输出结果相同,但 squares_gen 不会占用大量内存,特别适合处理大数据流。

四、生成器 vs 迭代器

你可能听说过“迭代器(Iterator)”。其实,生成器是迭代器的一种,但并非所有迭代器都是生成器。

  • 迭代器:任何实现了 __iter__()__next__() 方法的对象。
  • 生成器:通过函数 + yield 或生成器表达式自动创建的迭代器,无需手动实现上述方法。

因此,生成器是创建迭代器最简便的方式。

五、实际应用场景

生成器常用于以下场景:

  • 读取大文件(逐行处理,不加载全部内容)
  • 无限序列(如斐波那契数列)
  • 数据管道(链式处理:过滤 → 转换 → 输出)
def fibonacci():    a, b = 0, 1    while True:        yield a        a, b = b, a + bfib = fibonacci()for _ in range(10):    print(next(fib))# 输出前10个斐波那契数  

六、总结

通过本教程,你应该已经掌握了:

  • Python生成器 是一种高效的惰性求值工具;
  • yield关键字 让函数变成生成器,暂停并返回值;
  • 生成器表达式 提供了简洁的语法;
  • 生成器是 迭代器与生成器 体系中的重要组成部分。

现在,你可以尝试自己编写生成器来优化代码性能了!