Funktion bei falschem Input wiederholen in Python 3?

2 Antworten

Das "and" passt an der Stelle nicht. Das "and" verbindet boolsche Ausdrücke. Du willst aber einfach nur ein weiteres Statement ausfüheren. Packe dafür einfach das weitere Statement in die nächste Zeile:

print("Dieser Command existiert nicht.")
return nextstepfunction()

Wohlgemerkt: Es ist etwas ineffizient, hier die Funktion rekursiv aufzurufen. Verwende besser eine Schleife.

Weitere Anmerkungen:

Statt dem letztem elif kannst du auch ein else verwenden.

Mittels RegEx könntest du das parsing evtl. generischer gestalten (aber das ist vermutlich zu fortgeschritten an der Stelle).

PWolff  10.04.2023, 14:03

Haben die Python-Leute inzwischen den or-Operator auch für Listen erlaubt? (Man weiß ja nie ...) Sonst würde ich diese Verwendung von or anstelle des in-Operators für einen (weiteren) typischen Anfängerfehler halten.

Bei der Rekursion: man könnte ja mal ein Buch auf die Enter-Taste legen, dann dürfte der Aufrufstack ziemlich schnell überlaufen. (Oder - idiotensichere Software: Manche Idioten sind sehr erfinderisch, manche sehr geduldig)

Statt RegEx mit Alternativen wäre eine Liste sowieso sehr viel effektiver, oder man macht es wie in der guten, alten Zeit (TM), als es noch keine grafischen Oberflächen gab: Listenpunkte durchnummerieren und den Benutzer die Nummer eingeben lassen - oder die Anfangsbuchstaben der Optionen o. Ä.

Ob es weise war, reguläre Ausdrücke einem blutigen Anfänger gegenüber auch nur zu erwähnen? Das führt dann ganz, ganz schnell zu "Ich hatte ein Problem. Dagegen setzte ich einen regulären Ausdruck ein. Jetzt habe ich zwei Probleme."

0
Destranix  10.04.2023, 14:46
@PWolff
Sonst würde ich diese Verwendung von or anstelle des in-Operators für einen (weiteren) typischen Anfängerfehler halten.

Ja, stimmt, das ist auch falsch.

Statt RegEx mit Alternativen wäre eine Liste sowieso sehr viel effektiver, oder man macht es wie in der guten, alten Zeit (TM), als es noch keine grafischen Oberflächen gab: Listenpunkte durchnummerieren und den Benutzer die Nummer eingeben lassen - oder die Anfangsbuchstaben der Optionen o. Ä.

Naja, mit RegEx könnte man zum Beispiel leicht den Bewefhl in ein "go" + Richtung aufteilen, darauf wollte ich hinaus.

Das führt dann ganz, ganz schnell zu "Ich hatte ein Problem. Dagegen setzte ich einen regulären Ausdruck ein. Jetzt habe ich zwei Probleme."

Deshalb der Warnhinweis ;-)

0
    elif  next_step != "go left" or "go right" or "go forwards" or "go backwards":
        print("Dieser Command existiert nicht.") and return nextstepfunction()

Hier versuchst du noch einmal die Verneinung der vorherigen Bedingungen sicher zu stellen. Das ist unnötig, denn wenn das Programm hier ankommt waren die vorherigen Bedingungen falsch.

Man kann auch nicht links die Vergleichsvariable und rechts die Möglichkeiten mit or verknüpfen, wenn dann müsste es heißen:

    elif  next_step != "go left" and next_step != "go right" and next_step != "go forwards" and next_step != "go backwards":

Beachte and nicht or!

Oder aber:

elif  next_step not in ("go left","go right","go forwards","go backwards":

Dein Problem würde ich so lösen:

def nextstepfunction():
    done = False
    while not done:
      next_step = input("In welche Richtung möchtest du gehen?\n> ")
      done = True
      if next_step == "go left":
        x_cord-=1
      elif next_step == "go right":
        x_cord+=1
      elif next_step == "go forwards":
        y_cord+=1
      elif next_step == "go backwards":
        y_cord-=1
      else:
        print("Dieser Command existiert nicht.")
        done = False

Ab Python 3.10 gibt es das match - case statement:

def nextstepfunction():
    done = False
    while not done:
      next_step = input("In welche Richtung möchtest du gehen?\n> ")
      done = True
      match next_step:
        case "go left":
          x_cord-=1
        case "go right":
          x_cord+=1
        case "go forwards":
          y_cord+=1
        case "go backwards":
          y_cord-=1
        case _:
          print("Dieser Command existiert nicht.")
          done = False
PWolff  10.04.2023, 14:11

Das

          done = False

am Ende des Schleifenkörpers stört zwar mich weniger als Konstrukte wie

    if condition == true

aber immer noch genug, um es zu kommentieren.

0
Schachpapa  10.04.2023, 14:39
@PWolff

Warum? Es ist ja nicht am Ende des Schleifenkörpers, sondern im "else" bzw "_"-Zweig. Die Alternative wäre done = True in den vier anderen Zweigen oder while next_step not in ("go left", ...)

Bin für Verbesserungsvorschläge zu haben

1
PWolff  10.04.2023, 14:40
@Schachpapa

Hoppla, Flüchtigkeitsfehler meinerseits ... Asche auf mein Haupt

1