跳转至

Yield 暂停返回函数

yield 是 Python 中的一个关键字,用于定义生成器函数。生成器函数允许你在函数执行过程中暂停并返回一个值,而不是一次性返回所有值。每次调用生成器的 __next__() 方法时,函数会从上次暂停的地方继续执行,直到遇到下一个 yield 语句或函数结束。

以下是一个简单的例子,展示了如何使用 yield 关键字:

1
2
3
4
5
6
7
8
9
def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

在这个例子中,simple_generator 是一个生成器函数,每次调用 next(gen) 时,它会返回下一个 yield 语句的值。

生成斐波那契数列:

1
2
3
4
5
6
7
8
9
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# 使用生成器生成前10个斐波那契数
for num in fibonacci(10):
    print(num)

工作原理

  • 当生成器函数被调用时,返回一个生成器对象,函数体不会立即执行。
  • 调用 next() 或迭代生成器对象时,函数体开始执行,直到遇到 yield,返回 yield 后的值并暂停。
  • 再次调用 next() 时,函数从暂停处继续执行,直到下一个 yield 或函数结束。
  • 如果函数结束或遇到 return,生成器抛出 StopIteration 异常。

优点

  • 惰性求值:按需生成值,节省内存。
  • 无限序列:可以表示无限序列,如自然数。
  • 状态保持:生成器函数在 yield 后暂停,保留局部变量状态。

return 的区别

  • return 会终止函数的执行并返回一个值。
  • yield 会暂停函数的执行并返回一个值,但函数状态会被保留,以便下次继续执行。

例如:

1
2
3
4
5
6
7
def example_return():
    return 1
    return 2  # 这行代码永远不会被执行

def example_yield():
    yield 1
    yield 2  # 这行代码会在下一次调用生成器时被执行

example_return 中,函数在第一次 return 后就结束了,而在 example_yield 中,函数会在每次 yield 后暂停,并在下一次调用时继续执行。