我是一名C#程序员,试图理解一些Python代码。有问题的代码是生成器函数,如下所示:
def func():
oldValue = curValue
yield
curValue = oldValue
如果我理解正确,这将生成一个包含一个成员的可迭代序列。但是,yield
语句后没有表达式。什么是这种无表达式的陈述应该产生什么?有没有使用这种编码方式的Python习语?
答案 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
;您可以选择 yield
在with ... as
目标中使用的对象。关键是在输入上下文时运行yield
之前的所有内容,退出上下文后运行所有内容。