当Python的yield语句没有表达式时会发生什么?

9 投票
1 回答
1824 浏览
提问于 2025-04-18 02:00

我是一名C#程序员,正在尝试理解一些Python代码。这里的代码是一个生成器函数,看起来是这样的:

def func():
    oldValue = curValue
    yield
    curValue = oldValue

如果我理解得没错,这个代码会生成一个可迭代的序列,里面有一个成员。不过,在yield语句后面没有任何表达式。像这样的没有表达式的语句到底会产生什么呢?有没有什么Python的写法是利用这种方式的?

1 个回答

13

它会返回 None;就像一个空的 return 表达式一样:

>>> def func():
...     yield
... 
>>> f = func()
>>> next(f) is None
True

你可以用它来 暂停代码。在你第一次调用生成器的 next() 时,yield 之前的所有代码都会执行,而 yield 之后的代码只有在你再次调用 next() 时才会执行:

>>> def func():
...     print("Run this first for a while")
...     yield
...     print("Run this last, but only when we want it to")
... 
>>> f = func()
>>> next(f, None)
Run this first for a while
>>> next(f, None)
Run this last, but only when we want it to

我使用了 next() 的两个参数形式来忽略抛出的 StopIteration 异常。上面的内容不关心被 yield 的是什么,只在乎函数在那个点被暂停。

举个实际的例子,@contextlib.contextmanager 装饰器 完全期待你以这种方式使用 yield;你可以 选择性地 yield 一个对象,用于 with ... as 的目标。关键是,yield 之前的所有代码在进入上下文时执行,yield 之后的代码在退出上下文时执行。

撰写回答