Funktion mit Gedächtnis
Hallo zusammen, ist es eigentlich denkbar, dass eine Funktion sich Ergebnisse merkt und so z. B. auf das Ergebnis des letzten Durchgangs zurückgreifen kann - ohne, dass ich das Ergebnis wieder als Parameter übergeben muss!? Ich dachte an globale Konstanten, die man nicht verwenden soll. Listen haben - für mich - teilweise auch ein seltsames Verhalten!? Könnte man damit einer Funktion ein Gedächtnis geben!? Ist das sinnvoll? Schaffe ich mir Probleme!?
@pixewakb: Wenn man sich etwas über Funktionsaufrufe hinweg merken will/muss, dann verwendet man üblicherweise keine Funktionen sondern eine Klasse mit einer Methode. Damit hat man dann auch keine globalen *Variablen* (was *Konstanten* damit zu tun haben sollen erschliesst sich mir nicht so ganz). Wenn es wirklich nur eine Methode neben der `__init__()` gibt, bietet sich `__call__()` dafür an.
Das stellt sich mir die Frage, warum willst Du, dass sich eine Funktion einen inneren Zustand merkt und diesen bei weiteren Aufrufen verwendet? Gibt es ein konkretes Problem, von dem Du glaubst, es damit lösen zu können?
Ich definiere Funktionen nahezu ausschließlich referentiell transparent. Zusammengefasst: Bei gleichen Parametern gibt (bzw. sollte sie) die Funktion immer das gleiche Ergebnis zurück. Ist das nicht der Fall, dokumentiere ich dieses Verhalten explizit.
Will man das funktional lösen, könnte man den "inneren Zustand" als Parameter übergeben und könnte diesen (möglicherweise modifizierten) Zustand zusammen mit dem eigentlichen Berechnungsergebnis (als Tupel) zurück geben.
Objektorientiert ist BlackJacks Vorschlag die vorzuziehende Lösung (Python ist objektorientiert). Je nach Anwendungsfall wäre auch ein Generator angebracht (jerch). An diesem Punkt solltest Du uns verraten, was Du vorhast!
Ich definiere Funktionen nahezu ausschließlich referentiell transparent. Zusammengefasst: Bei gleichen Parametern gibt (bzw. sollte sie) die Funktion immer das gleiche Ergebnis zurück. Ist das nicht der Fall, dokumentiere ich dieses Verhalten explizit.
Will man das funktional lösen, könnte man den "inneren Zustand" als Parameter übergeben und könnte diesen (möglicherweise modifizierten) Zustand zusammen mit dem eigentlichen Berechnungsergebnis (als Tupel) zurück geben.
Objektorientiert ist BlackJacks Vorschlag die vorzuziehende Lösung (Python ist objektorientiert). Je nach Anwendungsfall wäre auch ein Generator angebracht (jerch). An diesem Punkt solltest Du uns verraten, was Du vorhast!
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Ok, ich kann meine Theorie vom Cache wohl verwerfen. Diesen Teil hatte ich gestern anscheinend überlesen.pixewakb hat geschrieben:(...) ohne, dass ich das Ergebnis wieder als Parameter übergeben muss!?
Aber 100%ig schlau aus dem Eingangsbeitrag werde ich immer noch nicht...
Hintergrund ist Zeitreihenanalyse mit exponentieller Glättung. Ich kann das anders (installierte Software) erledigen, würde es aber gerne Python erledigen lassen. Bei der exponentiellen Glättung wird das letzte Ergebnis wieder in die Formel eingesetzt, d. h. ich müsste das als Parameter wieder übergeben. Da eine Liste mit Messdaten abgearbeitet wird, dachte ich mir, dass es vielleicht eine sinnvolle Möglichkeit gibt, den "letzten" Wert irgendwie in der Funktion zu belassen. Vorteil für mich wäre das in der main-Schleife nicht irgendwelche Variablen irgendwelche Werte aufnehmen müssen. Wahrscheinlich dumme Idee!?
@pixewakb: Das klingt wirklich nach keiner so guten Idee. Da würde ich eine generische Funktion für schreiben die das wiederholte aufrufen mit dem letzten Wert erledigt.
Einer der Merkregeln für Python lautet: "Explicit is better than implicit".pixewakb hat geschrieben:Da eine Liste mit Messdaten abgearbeitet wird, dachte ich mir, dass es vielleicht eine sinnvolle Möglichkeit gibt, den "letzten" Wert irgendwie in der Funktion zu belassen. Vorteil für mich wäre das in der main-Schleife nicht irgendwelche Variablen irgendwelche Werte aufnehmen müssen. Wahrscheinlich dumme Idee!?
Mit anderen Worten: Das, was dir vielleicht im ersten Moment komfortabel erscheint, bringt zuviel Magie ins Spiel. Es hätte keinen wesentlichen Nachteil, wenn du beim Aufrufer den letzten Wert der Rückgabe ermittelst und den dann halt wieder übergibst. Es zwingt dich auch niemand dazu, das direkt in `main()` zu machen. Ich würde sogar dazu raten, dies auf jeden Fall auszulagern.