在 Python 生成器领域,yield 关键字是基石,允许创建可迭代序列。然而,除了yield之外,另一个神秘的函数也潜伏在阴影中:send。
文档提供了一个神秘的描述,指出send“恢复执行并将一个值“发送”到生成器函数中。”这引发了关于其目的及其与收益率的关系的问题。
值是输入和输出?
第一个困惑来自于值作为输入的概念到生成器函数。但是,文档还建议 send 返回生成器生成的下一个值。这不正是yield执行的功能吗?
揭示真正的目的
解决这个谜题的关键在于理解send可以注入值,而发电机正在屈服。考虑以下示例:
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
将此生成器想象为一个有两个孔的黑盒子:一个用于接收值(yield),一个用于返回值(yield)。如果您要调用 next(generator) 来启动生成器,它将在第一个yield 语句处暂停,等待输入。
现在,您可以使用 send 将值输入生成器。该值暂时存储在 x 变量中。恢复生成器后,第一个yield语句之外的代码将执行,有效地将输入值加倍并通过yield返回它。
一个非Yieldworthy示例
来演示要了解 send 的独特功能无法通过yield 实现,请考虑以下内容:
<code class="python">gen = double_inputs() next(gen) # run up to the first yield gen.send(10) # goes into 'x' variable</code>
此代码有效地将值 10 注入生成器。然后它恢复执行并返回 20,即双倍的值。这一系列操作不可能仅通过yield来实现。
Twisted 的 send 魔法
send 的一个实际应用是 Twisted 的 @defer.inlineCallbacks 装饰器。它允许您编写生成延迟对象(代表未来值)的函数。底层框架拦截这些Deferred对象,在后台执行必要的计算。
计算完成后,框架将结果发送回生成器,模拟恢复执行并让生成器继续进行后续操作操作。
结论
Python 生成器上的发送函数使您能够将值注入到在yield 语句处暂停的生成器中。此功能可实现复杂的控制流并简化异步编程,如 Twisted 的 @defer.inlineCallbacks 装饰器所示。通过了解 send 和 Yield 的独特用途,您可以在 Python 代码中释放生成器的全部潜力。
以上是Python 生成器中“send”函数的真正用途是什么?它与“yield”关键字有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!