Wie werden Python 2.7-Funktionsgeneratoren zugeordnet oder verschachtelt?

Wenn ich einen sehr einfachen (wenn auch möglicherweise sehr komplexen) Funktionsgenerator in Python 2.7 habe, wie folgt:

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

Was verwendet werden kann, wie folgt:

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

Was wäre ein einfacher Wrapper für einen anderen Funktionsgenerator, der das gleiche Ergebnis liefert, außer, dass er mit 2 multipliziert wird? Der obige Funktionsgenerator ist einfach, aber bitte nehmen Sie an, dass das Kopieren und Einfügen zu kompliziert ist. Ich versuche etwas wie:

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

der stellen Sie sich etwas Einfacheres vor:

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

Beide davon sind schrecklich pleite, so dass ich die Syntaxfehler nicht weitergeben werde, aber es kann veranschaulichen, was ich versuche zu tun.

Ideally, ich möchte etwas bekommen, wie:

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

Die Ergebnisse stimmen exakt mit denen des Originals überein, außer dass sie verdoppelt wurden.

Ich versuche zu vermeiden, dass ein sehr komplizierter Funktionsgenerator dupliziert wird, um ein identisches Ergebnis zu erzielen, mit Ausnahme der Skalierung durch einen bekannten Faktor.

Der zweite Generator hat letztendlich einen anderen Eingangsstrom, daher kann ich das Ergebnis des ersten Generators nicht einfach verwenden und verdoppeln. Ich brauche einen zweiten unabhängigen Generator, der den ersten verpackt.

Der Eingabestream ist unbestimmt, sodass es unmöglich ist, die gesamte Sequenz zu generieren und dann zu transformieren.

Es scheint, als ob ich diese Funktionsgeneratoren zuordnen oder verschachteln möchte, aber ich bin mir nicht sicher, welche Fachsprache ich verwenden soll, und deshalb komme ich in Google nicht weiter.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage