生成器函数是一种特殊的函数,它类似于普通函数,但使用 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
循环来遍历,然后输出每行的内容。