Seite 1 von 1
statische Variable in Funktionen
Verfasst: Sonntag 6. September 2015, 19:58
von alfred
Hallo Liebes Forum,
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:
so funktioniert es, aber gibt es auch noch eine andere Möglichkeit ohne ein global var zuerstellen.
Lieben Dank im Vorraus.
Alfred
Re: statische Variable in Funktionen
Verfasst: Sonntag 6. September 2015, 20:04
von BlackJack
@alfred: Man würde eine Klasse schreiben. Oder den Wert als Attribut an die Funktion binden.
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 15:42
von alfred
Hallo BlackJack,
danke für die Antwort,hast du hierzu ein Beispiel
"Oder den Wert als Attribut an die Funktion binden."
Gruß Alfred
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 15:59
von /me
Ich könnte mir die Sache mit dem Attribut spontan so vorstellen.
Code: Alles auswählen
def function():
if not hasattr(function, 'value'):
function.value = 0
print(function.value)
function.value += 1
function()
function()
function()
Grundsätzlich würde ich allerdings statt solcher Konstrukte eine Klasse verwenden.
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 17:02
von BlackJack
@alfred: Oder so:
Code: Alles auswählen
def function():
print(function.value)
function.value += 1
function.value = 0
function()
function()
function()
Allerdings ist beides nicht wirklich üblich. Wozu soll das denn gut sein?
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 18:30
von alfred
Lieben Dank für die schnellen Antworten.
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.
Nochmal besten Dank für die Hilfen
Gruß Alfred
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 18:55
von nezzcarth
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?
Re: statische Variable in Funktionen
Verfasst: Montag 7. September 2015, 19:03
von BlackJack
@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.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 12:06
von nezzcarth
@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.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 12:16
von BlackJack
@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.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 12:49
von jerch
@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.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 18:35
von alfred
Hallo BlackJack,
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.
Gruß Alfred
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 18:43
von BlackJack
@alfred: Python mag keine Probleme damit haben, Python-Programmierer aber schon. Das sieht einfach nicht nach Python aus.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 18:53
von cofi
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.
Re: statische Variable in Funktionen
Verfasst: Dienstag 8. September 2015, 19:13
von alfred
Hallo BlackJack,
hallo cofi,
ja da muss ich euch Recht geben, wer wie C schreibt, denkt warscheinlich auch immer in der altgewohnten weise.
Ich verspreche Besserung
Gruß Alfred