简单的 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' 点 --正在等待某人或某事打电话给 next
或 send
,但您可能对 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"
根据 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' 点 --正在等待某人或某事打电话给 next
或 send
,但您可能对 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"