Python 生成器
最后修改于 2025 年 2 月 24 日
Python 中的生成器是一种特殊类型的函数,它允许您迭代一系列值,而无需一次将所有值都存储在内存中。它们使用 `yield` 关键字定义,特别适合处理大型数据集或无限序列。本文将介绍 Python 生成器的基础知识、语法和实际示例。
生成器是返回迭代器的函数。与一次计算所有值并以列表形式返回的常规函数不同,生成器使用 `yield` 关键字一次生成一个值。这使得它们在内存方面非常高效,非常适合处理大型或无限序列。
简单生成器
此示例演示了一个从 0 到 4 生成数字的简单生成器。
simple_generator.py
def simple_generator():
yield 0
yield 1
yield 2
yield 3
yield 4
# Using the generator
for value in simple_generator():
print(value)
生成器函数 `simple_generator` 一次生成一个值。当进行迭代时,它会生成序列 0、1、2、3、4。
无限序列
此示例演示了一个生成无限数字序列的生成器。
infinite_sequence.py
def infinite_sequence():
num = 0
while True:
yield num
num += 1
# Using the generator
gen = infinite_sequence()
for _ in range(5):
print(next(gen))
生成器 `infinite_sequence` 生成一个从 0 开始的无限数字序列。`next` 函数用于从生成器中检索值。
斐波那契数列
此示例演示了一个斐波那契数列的生成器。
fibonacci_generator.py
def fibonacci_generator():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# Using the generator
gen = fibonacci_generator()
for _ in range(10):
print(next(gen))
生成器 `fibonacci_generator` 生成斐波那契数列。它即时生成值,使其对于大型序列在内存方面非常高效。
使用生成器进行过滤
此示例演示了如何使用生成器从序列中过滤偶数。
filter_generator.py
def filter_even(numbers):
for num in numbers:
if num % 2 == 0:
yield num
# Using the generator
numbers = range(10)
even_numbers = filter_even(numbers)
for num in even_numbers:
print(num)
生成器 `filter_even` 从序列中过滤偶数。它一次处理一个元素,使其在内存方面非常高效。
读取大文件
此示例演示了如何使用生成器逐行读取大文件。
read_file_generator.py
def read_large_file(filename):
with open(filename, 'r') as file:
for line in file:
yield line.strip()
# Using the generator
for line in read_large_file('large_file.txt'):
print(line)
生成器 `read_large_file` 逐行读取文件,使其适合处理大文件而无需将它们完全加载到内存中。
链接生成器
此示例演示了如何将多个生成器链接在一起。
chain_generators.py
def generator1():
yield 'A'
yield 'B'
def generator2():
yield 'C'
yield 'D'
def chain_generators(*generators):
for gen in generators:
yield from gen
# Using the generator
combined = chain_generators(generator1(), generator2())
for value in combined:
print(value)
生成器 `chain_generators` 使用 `yield from` 语法将多个生成器组合成一个序列。
生成器的优点
- 内存效率:生成器即时生成值,避免了将大型数据集存储在内存中的需要。
- 惰性求值:值仅在需要时才计算,从而提高了大型或无限序列的性能。
- 可读性:生成器提供了一种清晰简洁的序列处理方式。
来源
在本文中,我们探讨了 Python 生成器,并通过实际示例演示了它们的用例。
作者
列出所有 Python 教程。