Python while-Schleife neustarten?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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


holofoxx  17.06.2016, 23:17

BTW ist die Formatierung nicht richtig. Ich habs einfach aus PyCharm kopiert. Die Indentations sind nicht richtig hier bei gf.

0
holofoxx  17.06.2016, 23:25
@holofoxx
#/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.

0

Ich kenn mich zwar nicht mit python aus, aber ich glaube du solltest die Condition nach while schreiben.

while (output1 > 6 and output1 < 1)

illuslash1  17.06.2016, 22:31

Ich glaube du solltest auch "output1 = input()" in die Schleife geben. Sonst kann es das nicht wiederholen.

1
LifeArtist1  17.06.2016, 22:58

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...

0

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")

Woher ich das weiß:Studium / Ausbildung