Python while-Schleife neustarten?
Mein Code:
while True:
output = print ("Tippe drei Zahlen zwischen 1 und 6")
output1 = input ("Zahl 1:")
while True:
if (int (output1) <= 6 and int (output1) >= 1):
zahl1 = output1
break;
else:
input ("Die Zahl muss zwischen 1 und 6 liegen!")
output2 = input ("Zahl 2:")
while True:
if (int (output2) <= 6 and int (output2) >= 1):
zahl2 = output2
break;
else:
input ("Die Zahl muss zwischen 1 und 6 liegen!")
output3 = input ("Zahl 3:")
while True:
if (int (output3) <= 6 and int (output3) >= 1):
zahl3 = output3
break;
else:
input ("Die Zahl muss zwischen 1 und 6 liegen!")
Das Problem ist jetzt, dass wenn man eine zu hohe oder zu niedrige Zahl eingibt, die Fehlermeldung zwart kommt, allerdings die Schleife nicht neustartet, also nicht nochmal nach der Zahl fragt.
Könnt ihr mir helfen?
3 Antworten
Hi Habnefrage147,
wenn der Sinn deines Programms darin besteht den Nutzer nach 3 Zahlen zu fragen und zu prüfen ob alle 3 zwischen 1 und 6 liegen dann läuft dein Programm besser so:
#/usr/bin/python
#coding: utf-8
def checkNum(num):
if 1 <= num <= 6:
pass
elif num < 1:
print "Zahl ist zu klein"
else:
print "Zahl ist zu groß"
while True:
for i in range(1, 3):
print "Geben sie 3 Zahlen 1"
num = input("Geben sie eine Zahl zwischen 1 und 6 ein: ")
num = int(num)
checkNum(num)
i += 1
Das tut das was ich oben aus deinem Code gelesen habe. Eine while True: Schleife kann startet sich von selbst immer wieder neu. Das Problem liegt in deiner Programmlogik.
Wenn du den User außerdem nur fragen möchtest ob er wissen will ob seine Zahl größer oder kleiner als 1 bzw 6 ist, dann kann man das auch ganz viel einfacher gestalten. Soll dein Programm allerdings in einem anderen Zusammenhang wiederverwertbar sein, nimm nur die Funktion oben und nicht die while.
Bei Fragen bin ich stets ansprechbar.
Grüße foxx
#/usr/bin/python
#coding: utf-8
def checkNum(num):
if 1 <= num <= 6:
return True
elif num < 1:
print "Zahl ist zu klein"
else:
print "Zahl ist zu groß"
while True:
print "Geben sie 3 Zahlen ein"
for i in range(1, 3):
num = input("Geben sie eine Zahl zwischen 1 und 6 ein: ")
num = int(num)
checkNum(num)
i += 1
So ist das richtig.
Ich kenn mich zwar nicht mit python aus, aber ich glaube du solltest die Condition nach while schreiben.
while (output1 > 6 and output1 < 1)
Ich glaube du solltest auch "output1 = input()" in die Schleife geben. Sonst kann es das nicht wiederholen.
while True sorgt dafür, das die Schleife unendlich lang läuft. Ich denke eher, dass er in einer endlos schleife landet da er er wie du meintest output1 = input() schreiben muss anstatt überall nur input() was ja dann schließlich nicht die variable "updated" und er somit wieder beim else landet und dann immer so weiter...
Mein Vorschlag ist:
def numbers(count): #Iterator-Funktion die dich nach n Zahlen fragt
index = 0 #Helfer, um zu ermitteln, nach welcher Zahl gefragt wird.
while index < count: #Bricht ab, wenn "count" Zahlen abgefragt wurden
output = input(f"Zahl { index + 1 }:") #Frage nach der Zahl
if int(output) in range(1, 7): #Vorliebe
yield output #Das macht die Funktion zum Iterator
index += 1 #Helfer auf die nächste Zahl setzen
else:
#Fehlerbedingung, Helfer wird nicht hochgesetzt.
#Damit wird die selbe Zahl nochmal abgefragt
print("Die Zahl muss zwischen 1 und 6 liegen!")
#Programmstart
print("Tippe drei Zahlen zwischen 1 und 6")
#Ausgabe der Zahlen - ist natürlich beliebig.
print(list(numbers(3)))
Deine Frage enthält eine Menge kleiner Fehler:
output = print ("Tippe drei Zahlen zwischen 1 und 6")
Das "output = " ist überflüssig
output1 = input ("Zahl 1:")
Das sollte innerhalb der Schleife liegen, damit output1 in jedem Durchgang neu abgefragt wird.
while True:
if (int (output1) <= 6 and int (output1) >= 1):
Völlig in Ordnung
zahl1 = output1
Ist genau genommen überflüssig weil du am Ende eh alles in output1, ..2, ..3 stehen hast.
break;
else:
Völlig in Ordnung
input ("Die Zahl muss zwischen 1 und 6 liegen!")
An dieser Stelle liegt ein Fehler vor. Entweder du sagst "print" und ziehst das "output1 = input(..." in die Schleife oder du lässt das oben vor der Schleife und sagst hier "output1 = input ("Die Zahl muss zwischen 1 und 6 liegen!")"
Denn bei dem zweiten Schleifendurchlauf wird output1 nicht neu gesetzt und verbleibt sonst auf dem falschen Wert und du hast eine endlos-Schleife die immer wieder die letzte Frage stellt.
output2 = input ("Zahl 2:")
while True:
if (int (output2) <= 6 and int (output2) >= 1):
zahl2 = output2
break;
else:
input ("Die Zahl muss zwischen 1 und 6 liegen!")
...
Der Teil ist unschön, da im Prinzip 3x das Gleiche gemacht wird. Du kannst die Funktion in eine naja Funktion packen und dann einfach 3x aufrufen und die Ausgaben mit nem String - Format, oder einer String - concat dynamisch gestalten oder wie in meinem Beispiel die Schleife für die Fehleingaben UND die Iteration benutzen.
Dein Programm "minimal repariert" sieht so aus:
print ("Tippe drei Zahlen zwischen 1 und 6")
output1 = input ("Zahl 1:")
while True:
if (int (output1) <= 6 and int (output1) >= 1):
zahl1 = output1
break;
else:
output1 = input ("Die Zahl muss zwischen 1 und 6 liegen!")
output2 = input ("Zahl 2:")
while True:
if (int (output2) <= 6 and int (output2) >= 1):
zahl2 = output2
break;
else:
output2 = input ("Die Zahl muss zwischen 1 und 6 liegen!")
output3 = input ("Zahl 3:")
while True:
if (int (output3) <= 6 and int (output3) >= 1):
zahl3 = output3
break;
else:
output3 = input ("Die Zahl muss zwischen 1 und 6 liegen!")
Dein Programm minimal schöner und repariert sieht so aus:
print ("Tippe drei Zahlen zwischen 1 und 6")
def get_zahl(which):
output = input (f"Zahl {which}:")
while True:
if (int (output) <= 6 and int (output) >= 1):
return output
else:
output = input ("Die Zahl muss zwischen 1 und 6 liegen!")
output1 = get_zahl("1")
output2 = get_zahl("2")
output3 = get_zahl("3")
BTW ist die Formatierung nicht richtig. Ich habs einfach aus PyCharm kopiert. Die Indentations sind nicht richtig hier bei gf.