Variablen aus anderer Funktion verwenden

  • Hallo,


    mischtkrabb : es gibt _nur _genau_ einen_ Weg, den man benutzen will, um Werte aus einer Funktion zurück zu geben: das `return`Statement. Vergiß' am besten, dass es `global`gibt.


    Quote

    in den ganzen Tutorials und docs wird das jeweils nur für eine Funktion betrachtet. ich habe noch nichts gefunden, wo beschrieben ist wie man Variablen aus einer Funktion in einer anderen Funktion nutzt...

    In dem du den zurück gegbenen Wert der anderen Funktion übergibst? Ich verstehe ehrlich gesagt dein Problem nicht, weil das eigentlich alles mega-offensichtlich ist. Mach' mal bitte eine real-world Beispiel.


    Quote

    So wie ich das bisher kapiert und verstanden habe, ist wohl Beispiel 1 oder Beispiel 3 am besten

    Nein. Beispiel 1 ist richtg, Beispiel 3 returniert gar nichts sondern gibt nur nach stdout aus. Also bekommst du von Bsp 3 nichts, was du weiter verarbeiten kannst.


    Gruß, noisefloor

  • ...

    ..Ich verstehe ehrlich gesagt dein Problem nicht, weil das eigentlich alles mega-offensichtlich ist...

    jetzt wo ich das verstanden hab frag ich mich auch, warum das bei mir so lang gedauert hat ;-) dafür kämpfe ich nun mit anderen Dingen:


    Ich habe eine Funktion erstellt die Messwerte in eine Liste schreiben soll. Ich habe mehrere Messwerte die zeitgleich gemessen werden. Reicht hier eine Funktion aus um insgesamt 6 Listen zu erstellen? Natürlich kann man in der Funktion add 6 mal diversen Code schreiben .... ist aber viel zu tippen. Das geht sicher einfacher


    Python
    name=[]
    def add(x):
            name.append(x)
            print ("Liste:",name)
    
    add(wert1)

    Vielleicht kann mir jemand nen Denkanstoß in die richtige Richtung geben.


    ich möchte das ungefäht so aufrufen:

    add(wert1,wert2,wert3)

    oder

    add(wert1)

    add(wert2) usw.


    Das Problem daran ist, dass ich in der Funktion ja nur in Listen schreiben kann die vorher angelegt bzw. definiert wurden.

    Wie kann ich das ganz allgemein halten? Dass durch jeden Funktionsaufruf für x Messwerte automatisch eine Liste erstellt wird in die dann geschrieben werden kann?

    Geht das mit Funktionen überhaupt oder brauch ich da Klassen?

  • Grundsätzlich bitte neuer Thread bei neuem Problem.


    Zum einen ja, könntest du das über eine Klasse machen, musst aber nicht.

    Deine Funktion oben funktioniert nur, weil du schon wieder mit globalen Variablen arbeitest!


    oder



    EDIT: Am besten aber du beschreibst mal die Gesamtanforderung / Ziel.

  • Hallo,


    wenn du eine Liste nutzt _musst_ du die Funktion x-Mal hintereinander aufrufen, damit du eine garantierte Reihenfolge hast. Wenn du die Werte in beliebiger Reihenfolge und trotzdem zugeordenert speichern willst brauchst du als Datenstruktur ein Dict oder NamedTuple.


    Je nach dem, was du vorhast, kann auch der Einsatz von Data Classes Sinn machen. Gibt's aber erst ab Python 3.7.


    Gruß, noisefloor

  • Quote

    Grundsätzlich bitte neuer Thread bei neuem Problem.

    Danke für deine Geduld. Meine Probleme werden weniger, aber es sind immer noch viele vorhanden ;-) Ich dachte eben das passt hier zum Thema. Ich möchte auch nicht immer für jedes Problem einen neuen Threat erstellen.


    Quote

    Deine Funktion oben funktioniert nur, weil du schon wieder mit globalen Variablen arbeitest!

    Mir fehlt wohl noch sehr viel zum richtigen Verständnis in Python. Zb. die Listen die du in main() definierst ("speicher_a = []")... das ist doch auch sowas wie ne globale Variable? Ob ich die in ner Funktion oder außerhalb von irgendwas definiere kommt doch aufs selbe raus oder nicht? Sie stehen dann überall im Code zur verfügung... Ich hab früher in der Schule ein wenig C++ gemacht. Da war es so, dass alles ganz oben im Code deklariert werden musste. Vielleicht bringt mich das auch durcheinander...


    Quote

    EDIT: Am besten aber du beschreibst mal die Gesamtanforderung / Ziel.

    es geht mir immer noch um diesen Klimalogger

    Momentan versuche ich eben die ganzen Einzelteile in Funktionen auszulagern damit es in Python läuft. Wenn das alles so geht wie ich mir das vorstelle, will ich das über den Browser sehen und steuern können ... Und wenn ich das hab, bastel ich bei meinem Vater dann was damit er seine ganzen Temperaturen von seiner Heizung, Kessel, usw. grafisch auswerten kann.

  • wenn du eine Liste nutzt _musst_ du die Funktion x-Mal hintereinander aufrufen, damit du eine garantierte Reihenfolge hast.

    mein Programm läuft momentan in einer Endlosschleife. Nach x durchgängen wird was berechnet. Da ich für jeden Messwert eine eigene Liste haben möchte ist die Reihenfolge für den Mittelwert eigentlich egal. Die Werte kommen später in die Sqlite Datebank und lassen sich hier ja jederzeit abrufen um damit neue Listen zu bilden.

  • Hallo,


    Quote

    das ist doch auch sowas wie ne globale Variable?

    Es gibt in Python eine globalen Namensraum, aber keine globalen Variablen wie in anderen Programmiersprache.

    Bei Python reicht man _immer_ alles explizit herum und verlässt sich nicht auf den globalen Namensraum.


    Gruß, noisefloor

  • wenn man immer alles herumreicht funktioniert das Beispiel von Hofei aber nur 1 Mal. In einer Endlosschleife würde der Speicher bei jedem Aufruf von main() wieder "genullt" werden. Sowas muss ich doch irgendwo "außerhalb" definieren, dass es eine Liste namens Speicher gibt in die Werte geschrieben werden Können.

    Code
    def main():
        speicher = {"a": [], "b": []}
        speicher = messwert_hinzufuegen(speicher, "a", 1)
        speicher = messwert_hinzufuegen(speicher, "b", 2)
        speicher = messwert_hinzufuegen(speicher, "a", 3)
        
    main()
  • wenn man immer alles herumreicht funktioniert das Beispiel von Hofei aber nur 1 Mal. In einer Endlosschleife würde der Speicher bei jedem Aufruf von main() wieder "genullt" werden. Sowas muss ich doch irgendwo "außerhalb" definieren, dass es eine Liste namens Speicher gibt in die Werte geschrieben werden Können.

    Nein


    ->

    Code
    def main():
        speicher = {"a": [], "b": []}
        while True:
            speicher = messwert_hinzufuegen(speicher, "a", 1)
            speicher = messwert_hinzufuegen(speicher, "b", 2)
            speicher = messwert_hinzufuegen(speicher, "a", 3)
        
    main()

    ;)



    Mir fehlt wohl noch sehr viel zum richtigen Verständnis in Python. Zb. die Listen die du in main() definierst ("speicher_a = []")... das ist doch auch sowas wie ne globale Variable?

    Nein ist keine globale Variable, denn du musst diese explizit in die Funktion mit übergeben.


    Mein Tipp an dich, mach die ganz grundsätzlich mal mit folgenden Punkten vertraut, bevor du bei deinem Projekt weiter arbeitest:

    • Gültigkeitsraum einer Variable (Scope)
    • Verwendung von Funktionen
    • Funktionsweisen von Klassen
    • Verwendung von for und while Schleifen
    • Iteration
    • Listen
    • Dictionarys
    • Sets
    • Mutable - Immutable


    Da ich für jeden Messwert eine eigene Liste haben möchte ist die Reihenfolge für den Mittelwert eigentlich egal. Die Werte kommen später in die Sqlite Datebank und lassen sich hier ja jederzeit abrufen um damit neue Listen zu bilden.

    Dann wäre es aber gleich von Vorteil, wenn du dir den Zeitstempel mit speicherst in die Liste

  • Code
    def main():
        speicher = {"a": [], "b": []}
        while True:
            speicher = messwert_hinzufuegen(speicher, "a", 1)
            speicher = messwert_hinzufuegen(speicher, "b", 2)
            speicher = messwert_hinzufuegen(speicher, "a", 3)
        
    main()

    Du Fuchs Hofei

    Wenn ich sowas sehe versteh ich das und kann es nachvollziehen. Von selbst komm ich aber noch nicht drauf. Aber ganz unrecht hab ich damit nicht, dass der speicher außerhalb vom Aufruf definiert werden muss ;-)


    Quote

    Mein Tipp an dich, mach die ganz grundsätzlich mal mit folgenden Punkten vertraut, bevor du bei deinem Projekt weiter arbeitest:

    Da sagst du was ... Das ist viel Stoff. Ich versuche das alles nach und nach mit viel probieren und wurstel mich so durch. Wenn ich Im Buch ein Kapitel lese kann ich das alles nachvollziehen was dort beschrieben wird. Aber dann selbst was machen, da hapert es mit der Umsetzung, weil ichs wohl doch nicht so kapiert oder verinnerlicht hab.


    Quote

    Dann wäre es aber gleich von Vorteil, wenn du dir den Zeitstempel mit speicherst in die Liste

    Meine Datenbank speichert Zeit und Datum separat ab. Ich kann da auch Werte nach Datum usw. abrufen und verarbeiten. Das mit der Liste oben ist für mich ein kleines Progrämmchen zum rumprobieren und verstehen wie alles funktioniert und zusammenhängt. Immer kleine Schritte gehen ...

  • Aber ganz unrecht hab ich damit nicht, dass der speicher außerhalb vom Aufruf definiert werden muss


    Mein Tipp an dich, mach die ganz grundsätzlich mal mit folgenden Punkten vertraut, bevor du bei deinem Projekt weiter arbeitest:

    Gültigkeitsraum einer Variable (Scope)

    (:;)



    Aber dann selbst was machen, da hapert es mit der Umsetzung, weil ichs wohl doch nicht so kapiert oder verinnerlicht hab.

    Das ist ja kein Problem, kannst ja gerne immer hier nachfragen (also im Forum, nicht im selben Thread :lol:)



    Meine Datenbank speichert Zeit und Datum separat ab. Ich kann da auch Werte nach Datum usw. abrufen und verarbeiten.

    Das ist ja umständlich, warum nicht in einem Rutsch.


    Das mit der Liste oben ist für mich ein kleines Progrämmchen zum rumprobieren und verstehen wie alles funktioniert und zusammenhängt. Immer kleine Schritte gehen ...

    Aber ja, wenn es erstmal nur zum lernen dient alles ok.


    Du schriebst, du willst das ganze Visualisieren....kennst du Grafana (:https://grafana.com/

  • Das ist ja kein Problem, kannst ja gerne immer hier nachfragen (also im Forum, nicht im selben Thread :lol: )

    dann ist die Antwort hier nun verboten und SPAM? ;-)


    Das ist ja umständlich, warum nicht in einem Rutsch.


    Ich bastel gerade mit matplotlib und stelle fest, dass es einfacher wäre ich hätte Datum und Zeit als einen kompletten String in der Datenbank ... Fand das im Februar so eben übersichtlicher ..


    Und ja, Grafana hab ich schon mal gehört und gesehen, mich aber noch nicht damit beschäftigt. Ich hab mich damals für matplotlib entschieden ..

  • ann ist die Antwort hier nun verboten und SPAM?

    nö, meinte nur wegen : "Bei neuen Problemen ist es besser einen neuen Thread zu eröffnen"



    Ich bastel gerade mit matplotlib und stelle fest, dass es einfacher wäre ich hätte Datum und Zeit als einen kompletten String in der Datenbank ... Fand das im Februar so eben übersichtlicher ..

    am besten einfach als timestamp abspeichern



    Und ja, Grafana hab ich schon mal gehört und gesehen, mich aber noch nicht damit beschäftigt. Ich hab mich damals für matplotlib entschieden ..

    würd ich überdenken ;)

    https://kuehltest.linus.dev

    Stromzähler mit Raspberry Pi und ModBus auslesen

    Wetterstation inkl. Abgleich mit Vorhersagen


    Hier ein paar Links von meinen Dashboards^^