Python Generator "Kette" in einer for-Schleife

8

Ich versuche, eine "Verarbeitungspipeline" für Daten einzurichten, die ich aus einer Datenquelle einlese, und eine Folge von Operatoren (unter Verwendung von Generatoren) auf jedes Element anzuwenden, während es gelesen wird.

Ein Beispielcode, der das gleiche Problem zeigt.

%Vor%

Gewünscht : [17, 18, 19]
Aktuell : [31, 32, 33]

Python scheint den Wert von op nicht jedes Mal durch die for-Schleife zu speichern, sondern wendet stattdessen jedes Mal die dritte Funktion an. Gibt es eine Möglichkeit, die tatsächliche Operatorfunktion jedesmal durch die for-Schleife an den Generatorausdruck zu binden?

Ich könnte das trivial umgehen, indem ich den Generator-Ausdruck in der for-Schleife in ein Listen-Verständnis ändere, aber da die tatsächlichen Daten viel größer sind, möchte ich sie nicht alle im Speicher an irgendeinem Punkt speichern / p>     

gtback 25.01.2016, 14:30
quelle

4 Antworten

2

Sie können erzwingen, dass eine Variable gebunden wird, indem Sie den Generator in einer neuen Funktion erstellen. zB.

%Vor%

map_operator ist jedoch ziemlich identisch mit dem eingebauten map (in Python 3.x). Also benutze das stattdessen.

    
Dunes 25.01.2016, 16:53
quelle
2

Sie können einen kleinen Helfer definieren, der die Funktionen in umgekehrter Reihenfolge erstellt:

%Vor%

i.e. Sie können compose(f,g,h) verwenden, um einen Lambda-Ausdruck zu generieren, der äquivalent zu lambda x: h(g(f(x))) ist. Diese Reihenfolge ist ungewöhnlich, stellt aber sicher, dass Ihre Funktionen von links nach rechts angewendet werden (was Sie wahrscheinlich erwarten):

Damit wird Ihr main nur

%Vor%     
Frerich Raabe 25.01.2016 14:50
quelle
1

Dies kann sein, was Sie wollen - erstellen Sie eine zusammengesetzte Funktion:

%Vor%     
texasflood 25.01.2016 14:46
quelle
1

Der Grund für dieses Problem ist, dass Sie einen tief geschachtelten Generator von Generatoren erstellen und das Ganze nach der Schleife auswerten, wenn op an das letzte Element in der Liste gebunden wurde - - ähnlich dem ziemlich häufigen Problem "Lambda in einer Schleife" .

In gewissem Sinne entspricht Ihr Code ungefähr diesem:

%Vor%

Eine (nicht sehr schöne) Möglichkeit, dies zu beheben, wäre zip die Werte mit anderen Generator, die gleiche Operation zu wiederholen:

%Vor%     
tobias_k 25.01.2016 14:58
quelle

Tags und Links