pubanswer

如何理解Python中的yield用法?

michael2024-04-30

yield这个关键字在 Python 中是个神奇的存在。如果你刚刚踏入 Python 的世界,可能会对它感到一点点困惑。

yield 的本质

首先,得知道 yield 是啥。简单来说,yield 是 Python 中的一个关键字,它的作用有点像 return,但也有本质的不同。使用 yield 的函数被称为生成器(generator)。

def simple_generator():
    yield 1
    yield 2
    yield 3

当你调用这个函数时,它其实并不立即执行,而是返回一个生成器对象。你可以通过遍历这个对象,或者使用 next() 函数来逐个获取值。

为什么要用yield?

你可能会问,为啥要用这个麻烦的东西,直接返回列表不好吗?这就是 yield 神奇的地方了。

  • 节省内存:假设你要处理的数据量巨大,直接返回一个包含所有数据的列表可能会消耗掉大量内存。而 yield 每次只产生一个数据项,不需要一次性把所有数据加载到内存中。
  • 提高性能:你可以在需要数据的时候才生成它,而不是一开始就计算好所有的数据。

yield 的使用案例

想象一下,你要写个函数,生成斐波那契数列的前 N 项。

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

使用 yield,你可以这样获取斐波那契数列:

for num in fibonacci(10):
    print(num)

yield 和 return 的区别

  • return 在函数中返回一个值,之后函数会结束。
  • yield 返回一个值给调用者,并暂停执行,保持函数的状态,从而允许后续从它停止的地方继续执行。

yield from

进阶一点,yield from 用于在一个生成器中调用另一个生成器,这样可以更方便地编写嵌套的生成器。

def generator1():
    yield from range(3)
    yield from range(4)

list(generator1())  # [0, 1, 2, 0, 1, 2, 3]

看到这里,你是不是感觉 yield 已经没那么复杂了?实际上,开始用的时候可能会有些手忙脚乱,但一旦你掌握了它,就会发现它真的超级好用。希望这篇文章能帮你理解 yield,快去用起来吧!