在 Python 中,yield
是一个关键字,用于定义生成器函数。生成器是一种特殊的迭代器,它允许你逐个生成值,而不是一次性生成所有值并存储在内存中。这使得生成器在处理大量数据或无限序列时非常高效。
1. 基本概念
生成器函数与普通函数的主要区别在于,生成器函数使用 yield
返回值,而不是使用 return
。每次调用生成器函数时,它会从上次暂停的地方继续执行,而不是从头开始。
2. 简单示例
以下是一个简单的生成器示例,用于生成从 0 到指定数字的整数序列:
def simple_generator(n):
for i in range(n):
yield i
# 使用生成器
gen = simple_generator(5)
print(next(gen)) # 输出 0
print(next(gen)) # 输出 1
print(next(gen)) # 输出 2
print(next(gen)) # 输出 3
print(next(gen)) # 输出 4
# 如果继续调用 next(gen),会抛出 StopIteration 异常
3. 生成器的迭代
生成器可以像普通迭代器一样被迭代。以下是一个使用 for
循环的示例:
def simple_generator(n):
for i in range(n):
yield i
# 使用 for 循环迭代生成器
for num in simple_generator(5):
print(num) # 输出 0, 1, 2, 3, 4
4. 生成器的内存优势
生成器的一个重要特性是它不会一次性将所有值存储在内存中。这使得生成器在处理大量数据时非常高效。以下是一个对比示例:
# 使用列表存储大量数据
def large_list(n):
return [i for i in range(n)]
# 使用生成器生成大量数据
def large_generator(n):
for i in range(n):
yield i
# 测试内存使用
import sys
n = 1000000
print(sys.getsizeof(large_list(n))) # 输出约 8MB
print(sys.getsizeof(large_generator(n))) # 输出约 112 字节
5. 生成器的高级用法
生成器不仅可以生成简单的序列,还可以用于更复杂的任务,例如文件读取、数据处理等。以下是一个从文件中逐行读取内容的生成器示例:
def read_file(filename):
with open(filename, 'r') as file:
for line in file:
yield line.strip()
# 使用生成器读取文件
for line in read_file('example.txt'):
print(line)
6. 带有条件的生成器
生成器也可以在生成值时添加条件。以下是一个生成偶数的生成器示例:
def even_generator(n):
for i in range(n):
if i % 2 == 0:
yield i
# 使用生成器
for num in even_generator(10):
print(num) # 输出 0, 2, 4, 6, 8
7. 生成器表达式
生成器表达式是生成器的更简洁形式,类似于列表推导式。以下是一个生成器表达式的示例:
# 生成器表达式
gen_expr = (i for i in range(10) if i % 2 == 0)
# 使用生成器表达式
for num in gen_expr:
print(num) # 输出 0, 2, 4, 6, 8
8. 生成器的 send()
方法
生成器不仅可以生成值,还可以接收值。通过 send()
方法,可以在生成器中传递值。以下是一个示例:
def echo():
while True:
received = yield
print(f"Received: {received}")
# 使用 send() 方法
gen = echo()
next(gen) # 启动生成器
gen.send("Hello") # 输出 Received: Hello
gen.send("World") # 输出 Received: World
9. 生成器的 close()
方法
生成器可以通过 close()
方法提前关闭。以下是一个示例:
def simple_generator():
for i in range(10):
yield i
gen = simple_generator()
for num in gen:
print(num)
if num == 5:
gen.close() # 提前关闭生成器
10. 总结
yield
用于定义生成器函数。- 生成器逐个生成值,不会一次性占用大量内存。
- 生成器可以通过
next()
、for
循环等方式迭代。 - 生成器可以使用
send()
方法接收值,使用close()
方法关闭。 - 生成器表达式是生成器的简洁形式。
生成器是 Python 中非常强大的工具,尤其适用于处理大量数据或需要延迟计算的场景。