Python Wie kann ich einen Wert zwischenspeichern?

dieterz1

Ensign
Registriert
Jan. 2014
Beiträge
245
Hallo,
ich möchte erreichen das beim ersten Aufruf von "test" die Bedingung 1 erfüllt wird, beim zweiten Aufruf von "test" die Bedingung 2, beim dritten Aufruf wieder die Bedingung 1, beim vierten Aufruf wieder die Bedingung 2, beim fünften Aufruf die Bedingung 1 usw.

Nachfolgender Code funktioniert leider nicht, weil "variable" beim ersten Aufruf nicht definiert ist:
Python:
    def test(self):
        if variable is None:
            # Bedingung 1
            variable = true
        else:
            # Bedingung 2
            variable = None

Definiere ich jedoch die Variable, dann wird IMMER nur 1 Bedingung erfüllt:
Python:
    def test(self):
        variable = None
        if variable is None:
            # Bedingung 1
            variable = true
        else:
            # Bedingung 2
            variable = None

Wie kann ich eine Variable zwischenspeichern, damit sich mein Problem lösen lässt?
 
Was willst du denn erreichen?
 
Bagbag schrieb:
Was willst du denn erreichen?

"Hallo,
ich möchte erreichen das beim ersten Aufruf von "test" die Bedingung 1 erfüllt wird, beim zweiten Aufruf von "test" die Bedingung 2, beim dritten Aufruf wieder die Bedingung 1, beim vierten Aufruf wieder die Bedingung 2, beim fünften Aufruf die Bedingung 1 usw. "
 
Jo, das wäre die Frage.

Grundsätzlich ist sowas auch meiner Meinung nach einer ein Thema für eine integer Variable die um eins erhöhrt wird und mit modulo ausgewertet wird.

https://www.freecodecamp.org/news/t...r-what-does-the-symbol-mean-in-python-solved/

Alterantiv:

Müsste nicht (wie gesagt, ohne Python zu kennen)

Code:
    def test(self):
        if variable != true:
            # Bedingung 1
            variable = True
        else:
            # Bedingung 2
            variable = None

funktionieren?
 
Zuletzt bearbeitet:
Eh, ja, mein Fehler.

Python:
variable = None

    def test(self):
        if variable is None:
            # Bedingung 1
            variable = true
        else:
            # Bedingung 2
            variable = None
 
Bagbag schrieb:
Was willst du denn erreichen?
Um es einmal visuell auszudrücken:
Ein Mensch möchte mit einem einzigen Schalter das Licht sowohl an- als auch ausschalten können.
 
Probier mal die Variable "False" und nicht "None" zu setzen.... Meine None macht da Probleme. Bzw. 0 und 1 sollte ja auch zur unterscheidung reichen....
 
Ja, passt ja. Ich war da parallel an was anderem dran und habe beim lesen des zweiten Teils den ersten Teil schon wieder vergessen :D
 
irgendwie musst du dir den state ja merken, z.b. durch rückgabe des aktuellen werts:
Python:
def test(variable):
    if variable is None:
        # Bedingung 1
        variable = True
    else:
        # Bedingung 2
        variable = None

    return variable

a = None
for i in range(5):
    a = test(a)
    print(a)

oder du erstellst eine klasse, die die variable zwischen den funktionsaufrufen speichert:
Python:
class Bla(object):

    def __init__(self):
        self.variable = None

    def test(self):
        if self.variable is None:
            # Bedingung 1
            self.variable = True
        else:
            # Bedingung 2
            self.variable = None


a = Bla()
for i in range(5):
    a.test()
    print(a.variable)

ps: wehe das war ne hausaufgabe! :p
 
Zuletzt bearbeitet:
Hallo

Benutzt du eine Klasse?

Python:
class myTest:
    variable = None

    def test(self):
        if self.variable is None:
            self.variable = True
        else:
            self.variable = None

c = myTest()
c.test()
print(c.variable)
c.test()
print(c.variable)
c.test()
print(c.variable)
c.test()
print(c.variable)

Bringt bei mir:

Code:
python3 test.py
True
None
True
None

Gruesse
 
Zuletzt bearbeitet: (Formatierung + Typo)
Bagbag schrieb:
Eh, ja, mein Fehler.

Python:
variable = None

    def test(self):
        if variable is None:
            # Bedingung 1
            variable = true
        else:
            # Bedingung 2
            variable = None
Dieser Code funktioniert leider nicht.
FM: "UnboundLocalError: local variable 'variable' referenced before assignment"

Das definieren von "variable" außerhalb der Funktion "test" wird anscheinend nicht akzeptiert.
Ergänzung ()

0x8100 schrieb:
oder du erstellst eine klasse, die die variable zwischen den funktionsaufrufen speichert:
Python:
class Bla(object):

    def __init__(self):
        self.variable = None

    def test(self):
        if self.variable is None:
            # Bedingung 1
            self.variable = True
        else:
            # Bedingung 2
            self.variable = None
Das war der Durchbruch, danke!
 
Zuletzt bearbeitet:
Der Sinn von Klassen besteht darin, Zustand und Funktion zu bündeln bzw. zu kapseln, von daher bieten sie sich als Werkzeug an, wenn man genau dies machen möchte.
 
Kleiner Tipp:
oft geb ich einfach ein einfaches print mit in die Konsole wenn ich zB if/else abfragen hab usw. damit seh ich of auf den ersten BLick wenn ich zB falsche Variablen abfrage oder was falsches der aktuellen Funktion mitgebe usw.
bei riesigen Sachen evtl nicht so ideal, wenn mans wieder wegmachen will. aber oft bei Situationen dienlich, wo dein COde funktioniert, aber beim Testen nicht das Erwartete rauskommt.

btw, muss auch noch meinen Senf dazugeben. wenn man das in einem jupyter notebook macht, eifnach die letzte Zeile wiederholend in eienr eigenen Zelle ausführen. Sauberer wär trotzdem wie o.a. die Variante mit einer Klasse, um den Lichtschalter eine Instanz zu geben.
Python:
def lichtschalter(licht):
    if licht:
        licht = False
        print('Licht ist aus')
    elif licht is False:
        licht = True
        print('Licht ist wieder an')
    else:
        print('Kabel ab')
    
    return licht


licht = False

licht = lichtschalter(licht)
 
dieterz1 schrieb:
Wie kann ich eine Variable zwischenspeichern, damit sich mein Problem lösen lässt?
Vermutlich suchst Du so etwas wie das skalare '..' in Perl, den Flip-Flop-Operator?
in scalar context, ".." returns a boolean value. The operator is bistable, like a flip-flop, and emulates the line-range (comma) operator of sed, awk, and various editors. Each ".." operator maintains its own boolean state, even across calls to a subroutine that contains it. It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, AFTER which the range operator becomes false again. It doesn't become false till the next time the range operator is evaluated. It can test the right operand and become false on the same evaluation it became true (as in awk), but it still returns true once.
Beispiel:
Perl:
    # parse mail messages
    while (<>) {
        $in_header =   1  .. /^$/;
        $in_body   = /^$/ .. eof;
        if ($in_header) {
            # do something
        } else { # in body
            # do something else
        }
    }
 
Zurück
Oben