首页  >  文章  >  后端开发  >  Python 生成器中“send”函数的真正用途是什么?它与“yield”关键字有何不同?

Python 生成器中“send”函数的真正用途是什么?它与“yield”关键字有何不同?

Linda Hamilton
Linda Hamilton原创
2024-11-02 11:46:30489浏览

What is the true purpose of the

屏蔽生成器“发送”函数的目的

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn