yield 是 Python 中用于创建生成器(generator)的关键字,它允许函数返回一个可迭代的序列,同时保持函数的状态,以便下次调用时从停止的地方继续执行。
基本用法#
1. 简单的生成器函数#
def simple_generator():
yield 1
yield 2
yield 3
# 使用生成器
gen = simple_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 32. 使用 for 循环遍历生成器#
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
for number in count_up_to(5):
print(number) # 输出: 1, 2, 3, 4, 5高级用法#
3. 生成器表达式#
# 类似于列表推导式,但使用圆括号
squares = (x*x for x in range(5))
for num in squares:
print(num) # 输出: 0, 1, 4, 9, 164. 使用 send() 方法与生成器交互#
def generator_with_send():
value = yield "Starting"
while value:
value = yield f"Received: {value}"
gen = generator_with_send()
print(next(gen)) # 输出: Starting
print(gen.send("Hello")) # 输出: Received: Hello
print(gen.send("World")) # 输出: Received: World5. 使用 yield from 委托生成器#
def sub_generator():
yield from range(3)
yield from ["a", "b", "c"]
for item in sub_generator():
print(item) # 输出: 0, 1, 2, a, b, c实际应用场景#
6. 读取大文件#
def read_large_file(file_path):
with open(file_path, 'r') as file:
for line in file:
yield line.strip()
# 逐行处理大文件,避免一次性加载到内存
for line in read_large_file("large_file.txt"):
process_line(line) # 假设 process_line 是处理行的函数7. 生成无限序列#
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for i in range(10):
print(next(fib)) # 输出斐波那契数列的前10个数注意事项#
- 生成器只能迭代一次,迭代完毕后需要重新创建生成器对象才能再次使用
- 生成器不存储所有值,而是按需生成,节省内存
- 可以使用
return语句结束生成器,但返回值只能通过捕获StopIteration异常获取
yield 关键字使得 Python 能够高效处理大数据流和无限序列,是编写内存友好代码的重要工具。