Как отобразить или вложить генераторы функций Python 2.7?
Если у меня есть очень простой (хотя, возможно, очень сложный) генератор функций в 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.