Python 编写生成器函数

  • Post category:Python

生成器函数是一种特殊的函数,它类似于普通函数,但使用 yield关键字来指示生成器函数的暂停,并允许它返回值生成一个序列。使用生成器函数可以更加高效地处理迭代序列的情况,同时避免在内存中存储大量的元素。

基本语法

生成器函数的基本语法如下:

def generator_function():
    # 生成器函数体
    yield value

在函数体中使用 yield关键字可以返回一个暂停的值,这个值只在下一次迭代时生成,而不是在函数调用时返回。如上例代码所示,value为要生成的值。

使用方法

生成器函数可以像常规函数一样调用,但是返回一个生成器对象,而不是一个单独的值。可以使用 next()函数 iterate over the generator对象,每次调用next()函数可以产生下一个值,直到生成器函数执行完毕,此时会抛出 StopIteration 异常。

def generator_function():
    yield 1
    yield 2
    yield 3

gen = generator_function()

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

上面这个例子可以看到,每次调用 next(gen) 方法可以得到一个生成器函数中使用 yield返回的值。

另外,生成器函数也可以使用 for 循环来迭代生成器对象:

def generator_function():
    yield 1
    yield 2
    yield 3

gen = generator_function()

for value in gen:
    print(value) # 1, 2, 3

在上面这个例子里,我们使用 for 循环遍历了生成器函数返回的生成器对象的所有值。

示例说明

下面给出两个具体的示例,说明 Python 代码中如何使用生成器函数。

示例 1

def sequence(n):
    """一个简单的生成器函数,按顺序生成从0到n的所有整数"""
    i = 0
    while i < n:
        yield i
        i += 1

# 创建生成器对象
seq = sequence(5)

# 遍历生成器对象,打印生成的整数序列
for i in seq:
    print(i)

输出结果为:

0
1
2
3
4

在这个示例中,我们定义了一个函数 sequence(),该函数包含一个 while循环,该循环生成从0到n的所有整数。在循环内部,我们使用 yield关键字来生成值。当函数被调用时,它返回一个生成器对象,可以使用 for循环来遍历,然后输出整数序列。

示例 2

import csv

def read_csv(file_path):
    """读取一个 CSV 文件,并生成文件中的一行数据"""
    with open(file_path, newline="") as f:
        reader = csv.reader(f)
        header = next(reader)
        for row in reader:
            yield dict(zip(header, row))

# 创建生成器对象
data = read_csv("example.csv")

# 遍历生成器对象,并输出每行的内容
for row in data:
    print(row)

在这个示例中,我们定义了一个生成器函数 read_csv() 用于读取 CSV 文件,并用 yield 表示文件中的一行数据。在函数内部,我们使用 zip() 函数将一行数据与表头进行对应,并输出一个可读性好的字典对象。当该函数被调用时,它返回一个生成器对象,可以通过 for 循环来遍历,然后输出每行的内容。