如何映射或嵌套 Python 2.7 函数生成器?

2024-02-20

如果我在 Python 2.7 中有一个非常简单(尽管可能非常复杂)的函数生成器,如下所示:

def accumulator():
    x = yield 0
    while True:
        x += yield x

可以这样使用:

>>> a = accumulator()
>>> a.send(None)
0
>>> a.send(1)
1
>>> a.send(2)
3
>>> a.send(3)
6

另一个产生相同结果(除了乘以 2)的函数生成器的简单包装器是什么?上面的函数生成器很简单,但请假设它太复杂而无法复制粘贴。我正在尝试一些事情,比如:

def doubler():
    a = accumulator()
    a.send(None)
    y = yield 0
    while True:
        y = 2 * a.send(yield y)

或者,想象一些更简单的事情:

def doubler():
    a = accumulator()
    a.send = lambda v: 2 * super(self).send(v)
    return a

两者都严重损坏,所以我不会分享语法错误,但它可能说明我正在尝试做的事情。

理想情况下,我想要得到一些东西,比如:

>>> d = doubler()
>>> d.send(None)
0
>>> d.send(1)
2
>>> d.send(2)
6
>>> d.send(3)
12

结果与原始结果完全相同,只是增加了一倍。

我试图避免重复非常复杂的函数生成器来创建相同的结果,除非按已知因子进行缩放。

第二个生成器最终将具有不同的输入流,因此我不能只使用第一个生成器的结果并将其加倍。我需要第二个独立的生成器,包裹第一个生成器。

输入流是不确定的,因此不可能生成整个序列然后进行变换。

看来我想映射或嵌套这些函数生成器,但我不确定合适的术语,所以我在谷歌中一无所获。


如果您需要与协程具有相同的接口(即有一个send方法),那么 BrenBarn 的解决方案可能就这么简单。*

如果你可以有一个稍微不同的接口,那么高阶函数就更简单了:

def factor_wrapper(coroutine, factor):
    next(coroutine)
    return lambda x, c=coroutine, f=factor: f * c.send(x)

您可以按如下方式使用它:

>>> a = accumulator()
>>> a2 = factor_wrapper(a, 2)
>>> print a2(1)
2
>>> print a2(2)
6
>>> print a2(3)
12

*其实你can削减几行使其总共 4 行,尽管并没有真正降低太多复杂性。

def doubler(a):
    y = yield next(a)
    while True:
        y = yield (2 * a.send(y))

甚至更短...

def doubler(a, y=None):
    while True:
        y = yield 2 * a.send(y)

上述任何一个都可以按如下方式使用:

>>> a = accumulator()
>>> a2 = doubler(a)
>>> print a2.send(None) # Alternatively next(a2)
0
>>> print a2.send(1)
2
>>> print a2.send(2)
6
>>> print a2.send(3)
12
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何映射或嵌套 Python 2.7 函数生成器? 的相关文章

随机推荐

  • 从子线程停止主线程

    我正在编写一个python程序 在主函数中我正在启动一个连续运行的线程 启动线程后 主函数进入 while 循环 连续获取用户输入 如果子线程中出现异常 我也想结束主函数 最好的方法是什么 提前致谢 让线程 控制 其父级并不是一个好的做法
  • 排除日期晚于今天的项目

    我有一个关于 XSLT 的问题 在一个网站上 我有一个简单的日历 显示未来将要发生的事件 但当一个事件完成后 它应该从我的列表中删除 我所说的 完成 是指活动的日期已经过了今天 每个事件都附有日期 看下面的代码
  • 故意依赖 Linq Side Effects 是不好的做法吗?

    像这样的编程模式经常出现 int staleCount 0 fileUpdatesGridView DataSource MultiMerger TargetIds Select id gt FileDatabaseMerger merge
  • 使用 listpreference 并获取密钥有效,但没有“确定”按钮

    我在我的 android 应用程序中使用 listpreference 并获取我的键值 一切都很好并且工作正常 现在你们已经帮助了我 但是 当我的 listpreference 菜单弹出时 它们只包含一个取消按钮 假设用户正在红色 蓝色和绿
  • 在文本文件中附加新行的最佳变体是什么?

    我使用此代码将新行附加到文件末尾 let text New line to string let mut option OpenOptions new option read true option write true option cr
  • JTable 单元格中有两行或多行?

    如何将两行或多行放入一个 JTable 单元格中 我尝试在行尾添加 n 但它不起作用 尝试这样的 HTML lineOne br lineTwo
  • 关于 OpenGL 不变限定符的困惑

    我在翻阅橙皮书 第 3 版 时 在第 9 章中发现了一段关于不变限定符的段落 它说 The 不变的限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数 这段话出现在两个类似的代码片段之后 uniform mat4 MVPmatri
  • 如何每 x 秒调用一个函数并更新状态(React)

    我在这方面遇到了很多麻烦 我尝试了各种方法 我想在单击开始按钮后每秒调用一个函数 然后在单击停止按钮后暂停它 我不断出现我无法解释的奇怪行为 我怎样才能在没有课程的情况下做出反应 我有 triid 的东西 const simulation
  • 是否可以使用 System.IO.Packaging.Package 压缩文件夹并稍后向其中添加文件/文件夹?

    我想知道我们是否可以使用 net 类 ZipPackage http msdn microsoft com en us library system io packaging zippackage aspx将文件夹压缩到file zip文件
  • QTableView - 限制所选项目的数量?

    问题就在标题里 没有函数 QTableView set Max Number SelectedItems int 当所选项目的数量为 2 时 我想禁用项目选择 Thanks 您可以通过以下方式禁用选择 connect ui gt table
  • 如何在碰撞后实现超时/冷却

    我一直在做一个pygame两名玩家尝试将球击入网中的游戏 我的游戏中有一个增强功能 但是 我想要一些增强垫 当它们被收集时 我会获得 3 增强 在我下面的代码中 有一个巨大的黄色物体 当有人将鼠标悬停在它上面时 他们会得到提升 但他们可以永
  • 从 URL 安装 conda 包

    在康达 有没有办法直接从 URL 安装包 如下所示 conda install url https anaconda org conda forge pytest 3 4 0 download linux 64 pytest 3 4 0 p
  • 如何让日期时间对象感知(而不是幼稚)

    我需要做什么 我有一个不了解时区的日期时间对象 我需要向其中添加一个时区 以便能够将其与其他时区感知的日期时间对象进行比较 我不想在不知道这一遗留情况的情况下将整个应用程序转换为时区 我尝试过的 首先 演示一下问题 Python 2 6 1
  • Liquibase 无法启动,因为在“迁移文件:类路径”中找不到更改日志

    当我启动应用程序时 它失败并显示以下消息 指出更改日志文件的类路径不存在 Description Liquibase failed to start because no changelog could be found at Migrat
  • 获取今天的 NSDate,时间为 00:00:00

    我正在 Xcode 中编写一个类别 它将扩展当前的 NSDate 类 我想添加两种我经常使用的方法 但不知何故我无法让它们正常工作 目前我有这个代码 NSDate today NSCalendar gregorian NSCalendar
  • Spring Boot中如何设置嵌入式tomcat的日志级别?

    Spring Boot中如何设置嵌入式tomcat的日志级别 特别是我需要查看tomcat集群相关的日志 我将以下行添加到 application properties 中 但 tomcat 似乎只记录 INFO 级别日志 logging
  • Flutter调试release模式,release模式下启用日志

    根据文档我知道 调试信息被删除 调试已禁用 但是我们可以以某种方式强制打印日志 或者在发布模式下进行调试吗 生产应用程序 我正在使用 Android Studio 例如 在 AS 中开发 Android 应用程序时 我们可以打印日志 and
  • PHP lambda 函数和范围

    下面的函数接受一个数组并检查其键和值是否与指定的数据类型匹配 我似乎对之前工作的内部 lambda 函数遇到了一些问题 我正在运行 PHP v5 3 6 他们最后在 v5 3 4 下工作 他们抱怨未传递的变量不在范围内 如果我将该变量重述为
  • 如何使用 uiview 和 uibutton 检测对 Uitableview 单元格的点击?

    我创建了一个表视图 并将自定义 uiview 添加到单元格的内容视图中 uiview 有一个 uibutton 但是 我可以在创建单元格时将 uibutton 添加到内容视图中 我想获取桌面视图上的点击事件来执行某些操作 我还希望 uibu
  • 如何映射或嵌套 Python 2.7 函数生成器?

    如果我在 Python 2 7 中有一个非常简单 尽管可能非常复杂 的函数生成器 如下所示 def accumulator x yield 0 while True x yield x 可以这样使用 gt gt gt a accumulat