当前位置: 首页 > 面试题库 >

python生成器“发送”功能的目的?

莘俊能
2023-03-14
问题内容

有人可以给我一个为什么与Python生成器函数关联的“发送”函数存在的示例吗?我完全了解yield函数。但是,发送功能使我感到困惑。有关此方法的文档非常复杂:

generator.send(value)

恢复执行并将值“发送”到生成器函数。value参数成为当前yield表达式的结果。send()方法返回生成器产生的下一个值,如果生成器退出而不产生另一个值,则返回StopIteration。

这意味着什么?我以为价值是功能的输入?短语“
send()方法返回生成器产生的下一个值”似乎也是yield函数的确切目的;yield返回生成器产生的下一个值…

有人可以给我一个使用send的生成器的示例,该生成完成了某些无法完成的工作吗?


问题答案:

它用于将值发送到刚产生的生成器中。这是一个人为的(无用的)解释性示例:

>>> def double_inputs():
...     while True:
...         x = yield
...         yield x * 2
...
>>> gen = double_inputs()
>>> next(gen)       # run up to the first yield
>>> gen.send(10)    # goes into 'x' variable
20
>>> next(gen)       # run up to the next yield
>>> gen.send(6)     # goes into 'x' again
12
>>> next(gen)       # run up to the next yield
>>> gen.send(94.3)  # goes into 'x' again
188.5999999999999

您不能只通过做到这一点yield

至于为什么有用,我见过的最好的用例之一是Twisted的@defer.inlineCallbacks。本质上,它允许您编写如下函数:

@defer.inlineCallbacks
def doStuff():
    result = yield takesTwoSeconds()
    nextResult = yield takesTenSeconds(result * 10)
    defer.returnValue(nextResult / 10)

发生的情况是takesTwoSeconds()返回a
Deferred,这是一个值,该值保证一个值将在以后计算。Twisted可以在另一个线程中运行计算。计算完成后,将其传递给延迟的对象,然后将值发送回doStuff()函数。因此doStuff(),除了可以执行各种计算和回调等操作外,最终看起来或多或少都像普通的过程函数。此功能之前的替代方法是:

def doStuff():
    returnDeferred = defer.Deferred()
    def gotNextResult(nextResult):
        returnDeferred.callback(nextResult / 10)
    def gotResult(result):
        takesTenSeconds(result * 10).addCallback(gotNextResult)
    takesTwoSeconds().addCallback(gotResult)
    return returnDeferred

这更加令人费解和笨拙。



 类似资料:
  • 本文向大家介绍python实现邮件发送功能,包括了python实现邮件发送功能的使用技巧和注意事项,需要的朋友参考一下 什么是POP3、SMTP和MAP? POP3是Post Office Protocol 3的简称,即邮局协议的第三个版本,他是规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是因特网电子邮件的第一个离线协议的标准。POP3允许用户从服务器上把邮件存储

  • 本文向大家介绍python实现发送邮件功能,包括了python实现发送邮件功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现发送邮件功能的具体代码,供大家参考,具体内容如下 依赖: Python代码实现发送邮件,使用的模块是smtplib、MIMEText,实现代码之前需要导入包: 使用163邮件发送邮件,具体代码实现如下: 163邮箱的授权码获取方法如下: 1.

  • 简介 Laravel 基于 SwiftMailer 函数库提供了一套干净、简洁的邮件 API ,Laravel 为 SMTP 、Mailgun 、SparkPost 、 Amazon SES 、 PHP 的 mail 函数及 sendmail 提供驱动,让你可以快速从本地或云端服务自由地发送邮件。 驱动前提 基于 API 的驱动,例如 Mailgun 和 SparkPost 通常比 SMTP 服务

  • 本文向大家介绍Python smtplib实现发送邮件功能,包括了Python smtplib实现发送邮件功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python smtplib发送邮件功能的具体代码,供大家参考,具体内容如下 解决之前版本的问题,下面为最新版 配置文件emailConfig.ini 路径要与程序对应 之前版本出现的问题: 已测试通过,使用Header并没有变

  • 本文向大家介绍Python实现的双色球生成功能示例,包括了Python实现的双色球生成功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现的双色球生成功能。分享给大家供大家参考,具体如下: 最近学习Python的Random函数,就顺手写一个随机数的双色球程序,开发环境:python2.7 , 附上源代码如下: 运行结果: 其中蓝色6个。 也有简单的方法 运行结果: 或

  • 本文向大家介绍Python实现的生成格雷码功能示例,包括了Python实现的生成格雷码功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现的生成格雷码功能。分享给大家供大家参考,具体如下: 问题 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。 解决方法: 给定一个