Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ich habe ein Frage zu Funktionen, die ihren Variablen Wert nicht verlieren sollen, in C würde man eine statische Variable benutzen.
Wie kann ich das in Pyhton machen.
z.B:
Ich programmier eigendlich in C in AVRs.
Dann bin ich auf den Raspberry gestoßen und dadurch auf Python.
Durch dieses schöne Forum konnte ich mir viele Sachen der Sprache aneignen,
auch Bücher habe geholfen.
Doch leider denke ich noch nicht in Python sondern falle immer wieder in C.
Deswegen habe ich immer wieder Probleme mit den Variablen.
Wenn ich eine Funktion habe muss, die mir den letzte Wert speichern muss darf sie nicht lokal sein.
(wie oft wurde der Wert abgeholt; minmalwert; maxmalwert, Einschaltpunkt speichern ...)
In C würde ich eine static Variable nehmen.
Wenn ich dann die Funtion in ein andere Projekt kopiere oder upgrade mache, ist alles in der Funktion.
Nehme ich ein globale Variable wir es komplieziert.
Und wenn jetzt schon zwei sagen, ich würde ein Klasse verwenden, werde ich mich mal mit dem Thema beschäftigen.
Zurzeit habe ich alles nur mit Funktion aufgebaut.
BlackJack hat geschrieben:
Allerdings ist beides nicht wirklich üblich.
So aus Interesse:
Eine andere Lösung wäre ja, ein Closure mit nonlocal zu verwenden. Ist das ähnlich schlechter Stil, wie global, oder -- mal abgesehen vom Overhead -- gleich gut oder schlecht wie die beiden anderen Lösungen?
@nezzcarth: Ich würde sagen so ein Closure ist äquivalent zu einer Klasse, da es aber *einen* offensichtlichen Weg geben sollte, ziehe ich die Klasse vor. Zumal ``nonlocal`` ja noch nicht bei Python 2 existiert.
@BlackJack: Danke für deine Einschätzung Ich mag Closures halt recht gerne, aber mal abgesehen von Dekoratoren scheint es keine Anwendung zu geben, in denen sie die erste Wahl sind (und auch für Dekoratoren gibt es ja eine Klassen-basierte Alternative). Schade eigentlich.
@nezzcarth: Für kleine lokale Hilfsfunktionen sind sie oft praktisch wie `key`-Funktionen für's sortieren oder um das Gruppierungskriterium für `itertools.groupby()` zu berechnen.
@alfred: Mir fiel in Deinem ersten Beitrag gerade extrem auf das das nicht nach Python aussieht mit den ';' und den Klammern um die Bedingung beim ``if``.
Je nach dem was konkret gemacht werden soll, sind Generatorfunktionen noch eine Möglichkeit die man ins Augen fassen könnte und auf die man als C-Programmierer nicht immer sofort kommt weil es dort so etwas nicht gibt.
@alfred:
Auch in C ist Deine Lösung nicht besonders gut, da der Code nicht eintrittsinvariant ist. Das mag bei 99% des Codes egal sein, aber spätestens wenn Du mit Signalhandlern rumhantierst, kann das zum Problem werden. Lösung hier ist analog zu Python - globale Variablen so weit wie möglich vermeiden und alles Parametrisieren.
besten Dank für diesen Hinweis, ich habe mich mal kurz reingelesen, dies wäre eigentlich Perfekt.
Die sind schön in meine Buch beschrieben, aber wenn man nicht weiss wo nach man Sucht ...
Nochmals Danke!
Ja hinter jeder Zeile machen ich ein ';' auch bei Python und Bedingungen in Klammer. Python hat damit keine Probleme und wenn ich in C oder php programmier vergesse ich die nicht.
Mein grösster Feind ist der ':' ich weiss nicht wie oft ich den schon vergessen habe.
Ausserdem: Python ist kein C oder PHP. Es macht keinen Sinn wenn du die Sprachen syntaktisch angleichen kannst, die jeweiligen Idiome aber unvereinbar sind.
Sprich: Wenn du C in Python programmierst geht das schief, das Problem hier ist auch ein gutes Beispiel dafuer, und darum ist es IMO eine gute Idee den Unterschied schon auf der syntaktischen Ebene zu ziehen, damit du schon siehst wie du programmieren solltest.