Python while schleife?
Hallo zusammen,
Ich habe vor ein paar Wochen mit python angefangen und programmiere momentan, wie viele Anfänger, einen Gehaltsausrechner.
Dieser soll bei einer falschen Angabe eine Neustart Funktion haben. Dies habe ich bis jetzt mit einer While Schleife probiert, jedoch komm ich einfach nicht weiter. Wenn ich ein input habe, der beispielsweise über 7 ist, soll man die Möglichkeit haben, Ja für neu starten einzugeben und nein fürs beenden. Das beenden ist kein Problem, jedoch krieg ich das ja einfach nicht hin.
Falls ihr den Code benötigt, kann ich diesen gerne hier reinschicken, jedoch umfasst dieser knapp 300 Zeilen.
LG
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.
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).
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")
Das mit dem keep_going funktioniert ganz gut, jedoch hätte ich das gerne so:
Ich hoffe man versteht meinen Plan