在学习 Python生成器 的过程中,很多初学者会感到困惑:什么是生成器?它和普通函数有什么区别?为什么说它能节省内存?别担心!本教程将用通俗易懂的方式带你一步步掌握 生成器表达式、yield关键字 以及它与 迭代器与生成器 的关系。
生成器(Generator)是 Python 中一种特殊的迭代器。它不像列表或元组那样一次性把所有数据加载到内存中,而是“按需生成”——每次调用时才计算下一个值。这种特性让它在处理大量数据时非常高效,尤其适合内存受限的场景。
普通函数使用 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 不会占用大量内存,特别适合处理大数据流。
你可能听说过“迭代器(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个斐波那契数 通过本教程,你应该已经掌握了:
现在,你可以尝试自己编写生成器来优化代码性能了!
本文由主机测评网于2025-12-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212455.html