2026-10-20 11:22:58
Python生成器是一种特殊的迭代器,通过yield关键字实现逐个生成元素,以节省内存并支持延迟计算。

生成器函数:使用yield定义,例如:def my_generator(n): i = 0 while i < n: yield i i += 1gen = my_generator(5)print(next(gen)) # 输出 0
生成器表达式:类似列表推导式,但用圆括号创建,例如:gen = (x*2 for x in range(5))print(next(gen)) # 输出 0

生成器的核心优势
内存效率高:逐个生成元素,避免一次性存储整个序列,适合处理大型数据集或无限序列。
延迟计算:仅在需要时生成值,减少不必要的计算开销。
代码简洁性:生成器函数和表达式比手动实现迭代器更简洁,易于维护。
典型应用场景
处理大型文件:逐行读取文件,避免内存溢出。def read_large_file(file_path): with open(file_path, 'r') as f: for line in f: yield line.strip()for line in read_large_file('large_file.txt'): print(line)
生成无限序列:如斐波那契数列。def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + bfib = fibonacci()for i in range(10): print(next(fib)) # 输出前10个斐波那契数
构建数据管道:将数据分阶段处理,提高可读性。def data_source(): for i in range(10): yield idef square(data): for item in data: yield item * itemdata = data_source()squared_data = square(data)for item in squared_data: print(item) # 输出平方后的结果

yield from的用法yield from用于委托其他生成器的执行,简化嵌套生成器的代码。
def sub_generator(n): for i in range(n): yield idef main_generator(n): yield from sub_generator(n) yield "Done!"for item in main_generator(3): print(item) # 输出 0, 1, 2, Done!生成器与迭代器的区别
生成器是特殊的迭代器,通过yield自动实现__iter__()和__next__()方法。
普通迭代器需手动实现这两个方法,而生成器无需显式实现,代码更简洁。
生成器表达式的优缺点
优点:语法简洁,适合简单操作(如过滤、映射)。
缺点:无法包含复杂逻辑,功能受限。复杂场景应使用生成器函数。
生成器对代码质量的影响
可读性:通过分解逻辑为小生成器,避免大型临时结构,代码更清晰。
可维护性:生成器鼓励函数式编程风格,减少副作用,便于测试和复用。
生成器在异步编程中的历史角色在async/await出现前,生成器通过模拟协程行为实现异步I/O,允许程序在等待时切换任务。虽现被更现代的语法取代,但其设计思想仍具参考价值。
总结:生成器通过yield实现高效内存使用和延迟计算,适用于大型数据、无限序列及数据管道等场景。其简洁的语法和函数式风格显著提升了代码的可读性与可维护性,是Python中处理迭代任务的强大工具。