简单的 yield 关键字在 Python 中有什么作用?

What does a plain yield keyword do in Python?

根据 the Python documentation the yield keyword can take an "expression_list",但它是可选的:

yield_expression ::=  "yield" [expression_list]

我找不到此类用法的示例,无论是在 Python 文档中,还是在 What does the yield keyword do in Python 的任何答案中,也不是从一般的网络阅读中。

如果在没有 expression_list 的情况下使用 yield 那么我猜得到的方法不能用作生成器,所以在其他情况下普通的 yield 可能有用?

它的工作方式更像是一个没有参数的 return 简单地 returns None

>>> def foobar():
...    for i in range(10):
...        yield
>>>
>>> for token in foobar():
...    print(token)
None
None
None
None
None
None
None
None
None
None

当您编写协程时,您在函数中执行重要工作时,这种情况会更常见,而 yield 点就是 'pause' 点 --正在等待某人或某事打电话给 nextsend,但您可能对 return 没有任何顾虑。

>>> def do_important_work():
...
...    do_it = True
...    state = 0
...    while do_it:
...        print(state)
...        state += 1
...        # do some more important work here ...
...        do_it = yield
...
>>> worker = do_important_work()
... 
>>> worker.next()
>>> worker.send(True)
>>> worker.send(True)
>>> worker.send(True)
0
1
2
3

我认为 yield 的设计很简单,因此您不会 被迫 到 return 一个值,就像 return 的设计方式一样。

尽管它们几乎总是用作简单的生成器,yield 启用完全成熟的 coroutines.

除了用于从生成器/协同例程中发送值外,yield还可以接收值,以协调执行不同的协程套路。因此,如果您只想协调或接收值,则不需要 expression_list

这是一个简单的例子:

def infini_printer():
    while True:
        received = yield # get the received value into a variable
        print(received)

printer = infini_printer()
printer.next()              # returns None, since we didn't specify any expression after yield
printer.send("foo")         # prints "foo"