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)) # 输出: 3
2. 使用 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, 16
4. 使用 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: World
5. 使用 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 能够高效处理大数据流和无限序列,是编写内存友好代码的重要工具。