当Python的yield语句没有表达式时会发生什么?
我是一名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
之后的代码在退出上下文时执行。