语言基础 — yield

yield

This article is extracted from the chat log with AI. Please identify it with caution.

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个数

注意事项 #

  1. 生成器只能迭代一次,迭代完毕后需要重新创建生成器对象才能再次使用
  2. 生成器不存储所有值,而是按需生成,节省内存
  3. 可以使用 return 语句结束生成器,但返回值只能通过捕获 StopIteration 异常获取

yield 关键字使得 Python 能够高效处理大数据流和无限序列,是编写内存友好代码的重要工具。

本文共 531 字,创建于 Aug 26, 2025

相关标签: Python, 并发编程, ByAI, DeepSeek