Variable in Funktion Shiften

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hey Leute,

    habe aktuell ein kleines Problem beim Programmieren.

    Ich möchte eine Funktion Aufrufen und diese soll mit einem bestimmten Bitmuster von einem Istwert auf einen bestimmten Sollwert zählen.

    In meiner Schleife läuft auch alles ordentlich nach dem Muster ab, allerdings möchte ich am Ende der Schleife meine aktuellen Werte, welche zuletzt im Bitmuster abgelaufen wurden übergeben.

    Mein Code:


    Also mein return liefert zwar die richtigen Werte, welche mein out und mein previous_out haben und auch beim nächstmaligen Funktion bekommen müssen, aber ich stehe aktuell total auf dem Schlauch wie ich die Werte in meine out_values bekomme...

    Mein Print soll eigentlich wie folgt aussehen:

    0 out 1

    previous_out 0

    ist_wert 0

    1 out 1

    previous_out 1

    ist_wert 1

    2 out 0

    previous_out 1

    ist_wert 2

    3 out 0

    previous_out 0

    ist_wert 3

    4 out 1

    previous_out 0

    ist_wert 4

    Wenn ich jetzt meine Funktion nochmal starte soll es eigentlich so weitergehen...

    0 out 1

    previous_out 1

    ist_wert 0

    1 out 0

    previous_out 1

    ist_wert 1

    2 out 0

    previous_out 0

    ist_wert 2

    3 out 1

    previous_out 0

    ist_wert 3

    4 out 1

    previous_out 1

    ist_wert 4


    Habe halt an Shiften gedacht nur meine aktuellen versuche die Werte an meine out_values zu übergeben sind leider gescheitert..

    Mfg

    mochtend

  • Hallo,

    ich verstehe dein Problem nicht... Die Funktion bekommt keine Werte von aussen, sondern läuft immer mit ist_wert = 0 , soll_wert = 5 , out_values = [1,1,0,0] los. Was in der Funktion passiert ist auch fix, also liefert die Funktion immer das gleiche zurück. So hast du es programmiert.

    Und die Zeile print("out_values =", command[2], "out =", command[0], ";", "previous_out =", command[0]) soll doch wohl eher print("out_values =", command[2], "out =", command[0], ";", "previous_out =", command[1]) lauten.

    Gruß, noisefloor

  • Ja in diesem Beispiel hast du recht, da bekommt die Funktion keine Werte von außen. Allerdings ist mein Plan dieser Funktion Werte von Außen zu übergeben, damit ich einen Encoder beliebig einstellen kann.

    Hätte ich evtl. noch besser dabei schreiben sollen.

  • Code
    def EncoderInkr():

    Das ist eine Schreibweise für Klassen, selbst dann gehört die () weg, solange nicht vererbt wird.

    Eine Funktion schreibst du so: def encoder_inkr():

    Code
    command = EncoderInkr()

    So instanziert man ein Objekt/Instanz einer Klasse, du hast zuvor aber eine Funktion erstellt.

    command[2]

    Sowas, bezogen auf eine Funktion habe ich noch nie gesehen, da bitte ich die anderen Pythorianer um Aufklärung.

  • Ehrlich gesagt, verstehe ich die ganze Aufgabe nicht so richtig.

    Du hast 3 Ausgänge, die du schaltest. Wozu ist denn GPIO 13, 19, 26?

    So wie ich mir das vorstelle:

    Funktionen sind schon was Schönes.

    Sobald irgendwo in der Funktion das Schlüsselwort yield vorkommt, liefert die Funktion beim Aufruf einen Generator zurück.

    Es passiert erst mal gar nichts, bis der Generator konsumiert wird. Das kann entweder eine for-Schleife sein oder ein Typ wie z.B. list, tuple usw.

    Im Prinzip macht der Generator das, was du willst. Du kannst zwischen den Iterationen in der for-Schleife noch irgendwas anderes machen.


    Hofei die eckigen Klammern dienen für den Index-/Key-Zugriff oder fürs Slicing der Liste/Sequenz.

    Code
    my_list = ["A", "B", "C", "D", "E"]
    print(my_list[0])
    print(my_list[0::2]) # jedes zweite Element, von Index 0 ausgehend
  • Vorab, ich hatte noch nicht genug Zeit alle Beiträge von euch durchzuarbeiten, da es aber anscheinend Verwirrung über die Aufgabenstellung gibt:

    Also nur nochmal zur Erklärung (ich hoffe, dass man es versteht)

    Mein Ziel ist es einen Optischen Encoder mit Push-Button fernzusteuern.

    GPIO 13 ist der Push Button.. dieser wird einmal betätigt zur Eingabe und einmal zur Ausgabe.

    GPIO 19 ist mein OutB vom Encoder und GPIO 26 ist mein OutA

    Encoder Datenblatt ist angehängt.

    Da der Encoder nach einer Wahrheitstabelle arbeitet, muss ich diese zwangsläufig mit meinem Programm simulieren.

    Die Wahrheitstabelle ist im Datenblatt zu sehen.

    Hab mein Programm zwar am laufen, aber das ist eher Brute-Force und eher sehr unschön.

    Ich weiß meine "Etikette" im benennen der Variablen und sonstigem ist noch nicht so ganz Pyhton-konform, ich bin aber stets bemüht mich daran zu halten, allerdings ist die Umgewöhnung, der von mir Angeeigneten eigenen Art auf die Allgemeine Norm manchmal etwas.. nunja Träge :)

    Nämlich: nichts, da die Bedingung in Zeile 23 immer falsch ist. Daher dürfte die Funktion auch nichts zurückliefern und Du müsstest in Zeile 46 einen TypeError bekommen.

    Oh ja da hast du recht.. Allerdings sollte es für Erfahrene Leute ein einfaches sein ein versehentlich verwechseltes größer/kleiner Zeichen zu drehen.

    Hatte den Code fix von Hand neu aufgeschrieben, da ich meinen PI nicht bei hatte, als ich den Post gemacht habe. (Bin ein Fan von konstruktiver Kritik, dieser Post hat aber leider keinen Inhalt welcher konstruktiv ist)

    Hallo,

    ok... aber was hindert dich denn daran, der Funktion drei oder wie viel auch immer Werte mitzugeben? Basierend auf dem obigen Code weißt du doch, wie Funktions- / Methodenaufrufe mit Parameterübergabe funktionieren?

    Gruß, noiseflor

    Wie die Grundsätzliche Parameterübergabe funktioniert weiß ich schon, allerdings geht es mir hier um das ändern meiner Parameter nach jedem Durchlauf meiner Funktion (bezogen auf out_values), was finde ich etwas umständlicher ist, kann natürlich auch nur an meinen Verständnis liegen.

    Den Code muss noch testen und die für mich unbekannten Stellen recherschieren, von yield habe ich bis jetzt leider noch nichts gehört, aber es klingt sehr nützlich in deiner Formulierung.

    sehe ich das richtig, dass du mit dem if __name__ == "__main__": bezweckst, dass die GPIO.outputs beim Starten des Programms definiert und am Ende zurückgesetzt werden?

    Danke für eure Rückmeldungen! :)

  • als wolle der Verfasser einfach nur Klugscheißern

    Das liegt mir fern. Mein Beitrag sollte eher auf zugegeben etwas flapsige Art meinen Verdacht andeuten, daß das, was Du gepostet hast, nicht Dein tatsächlicher Code sei. Dieser Verdacht hat sich ja nun erhärtet. Klar kann ich

    ein versehentlich verwechseltes größer/kleiner Zeichen [...] drehen

    aber das wäre dann geraten. Und wer sagt mir, daß das der einzige Fehler im geposteten Code ist oder daß die anderen genauso offensichtlich sind? Daher finde ich es wichtig, wenn man nach Hilfe mit dem eigenen Code fragt, immer den echten Code (oder ein reduziertes Beispiel, das dann aber bitte darauf getestet ist, daß es die gleichen Probleme bereitet wie der eigentliche Code) zu posten, und nicht irgendetwas, was möglicherweise so ähnlich ist.

  • Das liegt mir fern. Mein Beitrag sollte eher auf zugegeben etwas flapsige Art meinen Verdacht andeuten, daß das, was Du gepostet hast, nicht Dein tatsächlicher Code sei. Dieser Verdacht hat sich ja nun erhärtet. Klar kann ich

    aber das wäre dann geraten. Und wer sagt mir, daß das der einzige Fehler im geposteten Code ist oder daß die anderen genauso offensichtlich sind? Daher finde ich es wichtig, wenn man nach Hilfe mit dem eigenen Code fragt, immer den echten Code (oder ein reduziertes Beispiel, das dann aber bitte darauf getestet ist, daß es die gleichen Probleme bereitet wie der eigentliche Code) zu posten, und nicht irgendetwas, was möglicherweise so ähnlich ist.

    Ja mein Tatsächlicher Code würde auch den Rahmen meiner Frage sprengen, daher auch nur der Ausschnitt der mir aktuell Probleme macht.

  • Hallo,

    was bezeichnest du denn genau als "...allerdings geht es mir hier um das ändern meiner Parameter nach jedem Durchlauf meiner Funktion..."?

    Ein Funktion in Python ist "durchgelaufen", wenn sie fertig abgearbeitet ist, d.h. alle for, while, ... Schleife sind durch und die Funktion gibt per `return` was zurück bzw. wenn es kein explizites `return` gibt, gibt es ein implizites `return None`.

    Wenn sich eine Funktion eine Zustand merken soll, braucht du die bereits besagte Generator-Funktion bzw. wenn du was in den Generator senden willst die send.

    Alternativ (und hier ggf einfacher) kann man es machen, wenn die Funktion genau _eine_ Sache macht und die die Funktion einfach entsprechend

    Oh ja da hast du recht.. Allerdings sollte es für Erfahrene Leute ein einfaches sein ein versehentlich verwechseltes größer/kleiner Zeichen zu drehen.

    Das ist nicht der Punkt. Es kommt hier leider sehr oft vor, dass Leute Code, den sie per Copy&Paste "programmiert" haben rein setzen, keinen Plan haben, was da passiert und dann hoffen, dass jemand den Code neu schreibt. Was nicht funktioniert.

    Außerdem ist es so, dass es immer extrem komisch aussieht, wenn jemand (wie du) nach spezifischen Problemlösung fragt, aber Code postet, der sehr offensichtlich nicht das machen kann, was er soll - wie Manul richtig angemerkt hast. Und die hier freiwillig alle in ihrer Freizeit helfen wollen haben auch sicherlich was besseres zu tun, als sich falschen Code erst Mal richtig zurecht zu raten, um dann das eigentlich Problem zu lösen. Von daher war der Einwand sehr berechtigt, aber dein Reaktion sicherlich nicht motivationssteigernd für die, die dir vielleicht helfen möchten.

    Gruß, noisefloor

    Einmal editiert, zuletzt von noisefloor (11. Dezember 2020 um 12:34) aus folgendem Grund: Syntax

  • Das ist nicht der Punkt. Es kommt hier leider sehr oft vor, dass Leute Code, den sie per Copy&Paste "programmiert" haben rein setzen, keinen Plan haben, was da passiert und dann hoffen, dass jemand den Code neu schreibt. Was nicht funktioniert.

    Außerdem ist es so, dass es immer extrem komisch aussieht, wenn jemand (wie du) nach spezifischen Problemlösung fragt, aber Code postet, der sehr offensichtlich nicht das machen kann, was er soll - wie Manul richtig angemerkt hast.

    Das jemand meinen Code neu schreibt habe ich nie verlangt, ich habe lediglich nach einem konkreten Problem gefragt, welches mich aktuell leider beschäftigt, daher kommt auch die Formulierung des spezifischen Problems.

    Und Code der sehr offensichtlich nicht das tut was er soll ist ja auch nicht ganz wahrheitsgemäß finde ich.

    MEIN Code erfüllt durchaus seinen Zweck allerdings habe ich halt ein Problem welches mich aktuell sehr aufhält, daher Frage ich schließlich hier im Forum nach Hilfe, da ich mit meiner Eigenrecherche, zu diesem Thema, in den Tutorials nicht sonderlich schlauer geworden bin.

    In der Suchfunktion findet man wirklich viele Beiträge, wo Leute insgeheim Fragen ob jemand einem die Lösung auf dem Silbertablett liefern könnte, sowas ist natürlich sonderlich schön und ich kann da die Aktive Community durchaus verstehen, dass sie skeptisch wird, allerdings ist dies nicht meine Intention hier, da ich auch selbst verstehen will, warum, weshalb und wieso.

    @DeaD_EyE ´s yield-Befehl bzw. das erwähnen der Generatorfunktion ist natürlich sehr hilfreich für mich, sein Code, welchen ich später noch durchgehen muss, ebenfalls!

  • @DeaD_EyE

    Hab den Code am Wochenende mal getestet.

    Der Output den ich bekomme ist: (mit rounds = 3)

    round = 0 last_value = 1 current_value = 1

    round = 0 last_value = 1 current_value = 0

    round = 0 last_value = 0 current_value = 0

    round = 1 last_value = 1 current_value = 1

    round = 1 last_value = 1 current_value = 0

    round = 1 last_value = 0 current_value = 0

    round = 2 last_value = 1 current_value = 1

    round = 2 last_value = 1 current_value = 0

    round = 2 last_value = 0 current_value = 0


    hab mich dann mal versucht in die einzelnen Funktionen von dir einzuarbeiten, allerdings ist mir das meiste davon leider neu :/

    Mit iterables generell habe ich noch nicht soviel zutun gehabt. Muss mich da wohl oder übel mal einlesen.

    Was mir aus dem Code nicht ganz klar wird ist, wo du z.B. den Ablauf von last_value & current_value festlegst.

  • Was mir aus dem Code nicht ganz klar wird ist, wo du z.B. den Ablauf von last_value & current_value festlegst.

    Wenn es um das Skript aus #9 geht, dann schau dir das Skript ab Zeile 30 an. Ich würde sagen, da wird beschrieben was mit 'last_value' und 'current_value' passieren soll.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Wenn es um das Skript aus #9 geht, dann schau dir das Skript ab Zeile 30 an. Ich würde sagen, da wird beschrieben was mit 'last_value' und 'current_value' passieren soll.

    Grüße

    Dennis

    Danke :)

    Habs eben auch endlich mal verstanden :D

    Bin grade dabei zu verstehen wie man die rounds ändert, dass ich

    round= 0 last_value= 1 current_value= 0

    round= 1 last_value= 1 current_value= 1

    round= 2 last_value= 0 current_value= 1

    round= 3 last_value= 0 current_value= 0

    erhalte.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!