ZetCode

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 生成器,并通过实际示例演示了它们的用例。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程