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

时间:2014-04-09 10:56:35

标签: python generator yield

我是一名C#程序员,试图理解一些Python代码。有问题的代码是生成器函数,如下所示:

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

如果我理解正确,这将生成一个包含一个成员的可迭代序列。但是,yield语句后没有表达式。什么是这种无表达式的陈述应该产生什么?有没有使用这种编码方式的Python习语?

1 个答案:

答案 0 :(得分:10)

它会产生None;就像空return表达式一样:

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

您可以使用它来暂停代码。当您第一次在生成器上调用yield时,next()之前的所有内容都会运行,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 decorator完全希望您以这种方式使用yield;您可以选择 yieldwith ... as目标中使用的对象。关键是在输入上下文时运行yield之前的所有内容,退出上下文后运行所有内容。