Tre*_*vor 5 python generator python-2.7
如果我在Python 2.7中有一个非常简单(尽管可能非常复杂)的函数生成器,就像这样:
def accumulator():
x = yield 0
while True:
x += yield x
Run Code Online (Sandbox Code Playgroud)
哪个可以使用,如下所示:
>>> a = accumulator()
>>> a.send(None)
0
>>> a.send(1)
1
>>> a.send(2)
3
>>> a.send(3)
6
Run Code Online (Sandbox Code Playgroud)
除了乘以2之外,另一个产生相同结果的函数生成器的简单包装器是什么?上面的函数生成器很简单,但请假设复制粘贴太复杂.我正在尝试一些事情,比如:
def doubler():
a = accumulator()
a.send(None)
y = yield 0
while True:
y = 2 * a.send(yield y)
Run Code Online (Sandbox Code Playgroud)
或者,想象一些更简单的事情:
def doubler():
a = accumulator()
a.send = lambda v: 2 * super(self).send(v)
return a
Run Code Online (Sandbox Code Playgroud)
两者都是可怕的破坏,所以我不会分享语法错误,但它可以说明我正在尝试做什么.
理想情况下,我想得到一些东西,比如:
>>> d = doubler()
>>> d.send(None)
0
>>> d.send(1)
2
>>> d.send(2)
6
>>> d.send(3)
12
Run Code Online (Sandbox Code Playgroud)
除了加倍之外,结果与原始结果完全相同.
我试图避免重复一个非常复杂的函数发生器来创建相同的结果,除了通过已知因子缩放.
第二个生成器最终会有一个不同的输入流,所以我不能只使用第一个生成器的结果并将其加倍.我需要第二个独立的发电机,包装第一个.
输入流是不确定的,因此不可能生成整个序列然后变换.
我似乎想映射或嵌套这些函数生成器,但我不确定适当的术语,所以我在谷歌无处可去.
如果您需要与协程具有相同的接口(即有一个send方法),那么 BrenBarn 的解决方案可能就这么简单。*
如果你可以有一个稍微不同的接口,那么高阶函数就更简单了:
def factor_wrapper(coroutine, factor):
next(coroutine)
return lambda x, c=coroutine, f=factor: f * c.send(x)
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用它:
>>> a = accumulator()
>>> a2 = factor_wrapper(a, 2)
>>> print a2(1)
2
>>> print a2(2)
6
>>> print a2(3)
12
Run Code Online (Sandbox Code Playgroud)
*实际上,您可以削减几行以使其总共 4 行,尽管并没有真正降低太多复杂性。
def doubler(a):
y = yield next(a)
while True:
y = yield (2 * a.send(y))
Run Code Online (Sandbox Code Playgroud)
甚至更短...
def doubler(a, y=None):
while True:
y = yield 2 * a.send(y)
Run Code Online (Sandbox Code Playgroud)
上述任何一个都可以按如下方式使用:
>>> 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |