普通的yield关键字在Python中有什么作用?

时间:2015-03-05 14:24:14

标签: python yield

根据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>

2 个答案:

答案 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点只是'暂停'点 - 等待某人或要调用nextsend的内容,但您可能无法回复任何问题。

>>> 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的设计方式一样。