根据the Python documentation,yield关键字可以采用" expression_list",但它是可选的:
yield_expression ::= "yield" [expression_list]
我无法在Python文档,What does the yield keyword do in Python的任何答案中找到此类用法的示例,也无法在网络上阅读。
如果在没有yield
的情况下使用expression_list
,那么我猜结果方法不能用作生成器,那么是否有其他情况可以使用普通yield
?< / p>
答案 0 :(得分:9)
虽然它们几乎总是用作简单的生成器,yield
可以实现完全成熟的 coroutines 。
除了接收值之外,您还可以将值发送到产生的方法中。因此,如果您只想发送此类值,则不需要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"
答案 1 :(得分:4)
它更像是没有参数的return
只返回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
点只是'暂停'点 - 等待某人或要调用next
或send
的内容,但您可能无法回复任何问题。
>>> 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
的设计方式一样。