statische Variable in Funktionen

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.
Antworten
alfred
User
Beiträge: 7
Registriert: Dienstag 16. Dezember 2014, 20:57

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:

Code: Alles auswählen

def test():
    global a;
    a+=1;
    if(a==100):
        ....
so funktioniert es, aber gibt es auch noch eine andere Möglichkeit ohne ein global var zuerstellen.
Lieben Dank im Vorraus.

Alfred
BlackJack

@alfred: Man würde eine Klasse schreiben. Oder den Wert als Attribut an die Funktion binden.
alfred
User
Beiträge: 7
Registriert: Dienstag 16. Dezember 2014, 20:57

Hallo BlackJack,

danke für die Antwort,hast du hierzu ein Beispiel

"Oder den Wert als Attribut an die Funktion binden."

Gruß Alfred
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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?
alfred
User
Beiträge: 7
Registriert: Dienstag 16. Dezember 2014, 20:57

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
nezzcarth
User
Beiträge: 1631
Registriert: Samstag 16. April 2011, 12:47

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?
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.
nezzcarth
User
Beiträge: 1631
Registriert: Samstag 16. April 2011, 12:47

@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.
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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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.
alfred
User
Beiträge: 7
Registriert: Dienstag 16. Dezember 2014, 20:57

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
BlackJack

@alfred: Python mag keine Probleme damit haben, Python-Programmierer aber schon. Das sieht einfach nicht nach Python aus.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
alfred
User
Beiträge: 7
Registriert: Dienstag 16. Dezember 2014, 20:57

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
Antworten