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

标签 python python-2.7 generator

如果我在 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

除了加倍之外,结果与原始结果完全相同。

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

第二个生成器最终会有不同的输入流,所以我不能只使用第一个生成器的结果并将其加倍。我需要第二个独立的生成器来包装第一个。

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

看来我想映射或嵌套这些函数生成器,但我不确定合适的行话,所以我在 Google 上一无所获。

最佳答案

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

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

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

*实际上您可以削减几行使其总共 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

关于python - 如何映射或嵌套 Python 2.7 函数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859986/

相关文章:

python - 如何在 Debug模式下调用PySpark?

Python 将日期时间设置为 UTC 时区

python - 使用生成器构建矩阵

python - 获取 ZeroDivisionError : float division in python

python - 在日和月合并 2 个数据框

python - GTK 焦点链

python - 与 itertools.dropwhile 相反(如何在 N 次迭代后停止生成器)

python - Python中的产量中断

python - 实现延迟的 Slack 斜线响应

python - IplImage 里面的 IplImage