Python while schleife?

2 Antworten

Falls ihr den Code benötigt, kann ich diesen gerne hier reinschicken, jedoch umfasst dieser knapp 300 Zeilen.

Das relevante Codeschnipsel sollte aber eher nur 3 Zeilen lang sein. Was ist das Problem? Die Schleife, die Eingabe...?

Ein gängiger Ansatz für sowas ist eine Endlosschleife, aus der man nur bei Bedarf mit break ausbricht:

while True:
   # tu was
   # ...
   if eingabe > 7:
      break

Oder man hat eine Abbruchbedingung für die Schleife:

keep_going = True
while keep_going:
   # tu was
   # ...
   if eingabe > 7:
      keep_going = False

Oder diverse andere Varianten.

Es ist sinnvoll, sowas erst in ganz kleinen Beispielen zu üben, statt gleich mit 300 Zeilen.


DasSoZZLe 
Beitragsersteller
 17.11.2023, 08:50

Das mit dem keep_going funktioniert ganz gut, jedoch hätte ich das gerne so:

  • keep_going = True
  • while keep_going:
  • Arbeitstage = input(„Bitte geben sie ihre Arbeitstage ein“)
  • if float(Arbeitstage) > 7:
  • print(„Ungültige Wochenlänge“)
  • restart = input(„Wollen sie das Programm neustarten?“)
  • if restart.lower == „nein“
  • break
  • elif restart.lower == „ja“
  • #Zurück zum Anfang der Schleife

Ich hoffe man versteht meinen Plan

jo135  17.11.2023, 08:52
@DasSoZZLe

Und wo ist die Schwierigkeit? Du setzt keep_going auf False, wenn abgebrochen werden soll. Ansonsten geht die Schleife sowieso ganz automatisch wieder von vorne los. Das break kannst du dir sparen.

Wenn du erzwingen willst, dass der aktuelle Durchlauf unterbrochen wird, nicht aber die Schleife als Ganzes, kannst du continue verwenden. Damit geht's wieder an den Anfang (also die Prüfung der Abbruchbedingung).

DasSoZZLe 
Beitragsersteller
 17.11.2023, 08:57
@jo135

Tut mir leid das die Frage vielleicht etwas doof war, aber ich saß da jetzt schon so lange dran und habs einfach nicht hinbekommen.
Hat jetzt aber funktioniert, vielen Dank

jo135  17.11.2023, 08:58
@DasSoZZLe

Frage war gar nicht doof, es wird nur manchmal aus der Frage nicht klar, wo genau das Problem liegt.

Ich hab dafür eine Funktion, die einfach so oft fragt, bis der Benutzer einen gültigen Wert eingibt:

def numInput(prompt=None, minimum=float("-inf"), maximum=float("inf"), errorMessage=None):
    if errorMessage == None:
        errorMessage = f"Die Zahl muss zwischen {minimum} und {maximum} liegen."
        
    while True:
        inputStr = input(prompt)
        try:
            value = float(inputStr)
        except ValueError:
            print("Ungültiges Zahlenformat")
            continue

        if value >= minimum and value <= maximum:
            return value
        else:
            print(errorMessage)

Das kannst du dann in deinem Beispiel einfach so aufrufen:

arbeitstage = numInput("Bitte geben Sie ihre Arbeitstage ein: ", 1, 7, "Ungültige Wochenlänge")

Wenn der Benutzer irgendwas eingibt, was entweder keine Zahl ist oder nicht im Bereich 1-7 liegt, fragt die Funktion einfach nochmal.

Ich würde auch bei einer Falscheingabe nicht gleich nachfragen, ob das Programm beendet werden oder komplett neugestartet werden soll. Stell dir mal vor, du machst in Excel einen versehentlichen Schreibfehler und hast danach nur die Optionen, die ganze Arbeitsmappe neu von vorne anzufangen oder das Programm zu beenden.

Für Texteingaben habe ich aber eine ähnliche Funktion:

import re
def strInput(prompt=None, pattern=".*", errorMessage="Ungültige Eingabe"):
    while True:
        inputStr = input(prompt)

        if re.fullmatch(pattern, inputStr):
            return inputStr
        else:
            print(errorMessage)

Die Funktion macht fast das Gleiche, wie die Funktion für Zahlen, nur dass hier die Eingabe mit einem regulären Ausdruck geprüft wird.

neustart = strInput("Soll das Programm neu gestartet werden? ", "(?i)ja|nein")