1
votes

Comment puis-je quitter une boucle while-true après 5 essais?

Dans mon introduction au cours d'informatique, on nous a posé un problème où nous devions créer une boucle qui demandait le mot de passe d'une personne:

while True:
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
print("Welcome!")

Comment puis-je le changer pour qu'après 5 essaie / devine le mot de passe, il dit "tout sans suppositions de mot de passe" (ou quelque chose de ce genre)?


4 commentaires

Connaissez-vous les compteurs? Avez-vous pensé à en créer un et à l'incrémenter à chaque estimation?


Essayez de créer une condition différente de celle avec True. Vous pouvez utiliser une boucle for ou vous pouvez utiliser une variable de compteur, pour donner 2 options


pourquoi ne pas utiliser une boucle for ?


la plupart des langages de programmation fournissent une boucle for pour résoudre ce problème très courant.


6 Réponses :


-1
votes

Créez un compteur et faites-le compter à rebours. La condition de la boucle while doit être "lorsque le compteur atteint 0":

for i in range(5):  # will execute 5 times with i = 0, 1, 2, 3, 4 in that order
    ...

Vous devrez peut-être réécrire certaines choses afin que des choses différentes se produisent lorsque vous time out avec le compteur, par rapport à l'obtention du mot de passe correct.


Alternativement, une version plus correcte consisterait à utiliser une boucle for au lieu d'une boucle while :

counter = 5
while counter > 0:
    counter -= 1
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
print("Welcome!")

mais si vous n'utilisez pas la variable i pour quelque chose en particulier, a while fonctionnera tout aussi bien.


0 commentaires

0
votes

Je suis d'accord avec @mauve qu'une boucle while n'est pas exactement ce que vous recherchez, mais vous pouvez toujours le faire avec un compteur:

for i in range(max_tries):
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")

else:
    raise ValueError("Too many attempts")

Cependant, il peut être un peu plus clair d'utiliser une boucle for

for i in range(max_tries):
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")

if i == max_tries:
    raise ValueError("Too many attempts")

Vous pouvez utiliser un else à la fin de votre boucle for comme donc:

max_tries = 5

while max_tries > 0: # We will decrement max_tries on each loop
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
    max_tries -= 1 # Decrement max_tries

if max_tries==0: # We tried too many times
    raise ValueError("Too many attempts!")

Où le else attrapera le cas où un break n'a pas été appelé avant la fin du boucle


0 commentaires

3
votes

Beaucoup de gens ne sont pas familiers avec la construction for ... else , qui est classique dans ce cas

for attempt in range(5):
    password = input('What is your password?')
    if password == "abc123":
        print("Welcome!")
        break
else:
    print("all out of password guesses")

Le else être exécuté uniquement si un break n'est pas rencontré


1 commentaires

cela fonctionne, mais il affiche toujours "Bienvenue!" à la fin



0
votes

En effet, ce n'est pas vraiment un "while true" si vous avez une limite de bouclage. Vous pouvez réaliser la même chose en vérifiant simplement le mot de passe 5 (ou n fois).

try_num = 0
success = False
    while True:
        try_num = try_num + 1
        password = input('What is your password?')
        if password == "abc123":
            success = True
            break
        if try_num > 5:
            break
        print("Please Try Again")
if success == True:
    print("Welcome!")

Si vous devez avoir un temps True pour un format spécifique attendu par l'évaluateur / l'enseignant / le devoir, vous pourrait toujours utiliser ce compteur et entrer dans le while True .

try_num = 0
    while try_num <= 5:
        try_num = try_num + 1
        <rest of the code>

Vous pouvez voir que l'option 1 est plus élégante et plus simple à maintenir. p>


0 commentaires

0
votes

Vous pouvez également utiliser la boucle while ... else :

attempts = 0
while attempts < 5:
    password = input('What is your password?')
    if password == "abc123":
        print("Welcome!")
        break
    print("Please Try Again")
    attempts += 1
else:
    print('You have exceeded the number of allowed login attempts!')


0 commentaires

-1
votes

Je suis vraiment noob non seulement en python mais en programmation en général. Juste apprendre tout en étant quarentined Je suis venu avec ce code pour faire ce que l'op a demandé. Je fais un cours en ligne et l'activité me l'a demandé. Cela peut vous sembler stupide et il y a certainement de meilleures façons de faire ce que j'ai fait ici, mais cela fonctionne. (l'activité demandée de le faire avec While True)

rainbow = ("red, orange, yellow, green, blue, indigo, violet")
while True:
    color_input = input("Enter a color of the rainbow: ")
    if color_input.lower() in rainbow:
        print ("Great, you did it!! ")
        break
    else:
        print ("Wrong, you still have 3 tries.")

        while True:
            color_input = input("Enter a color of the rainbow: ")
            if color_input.lower() in rainbow:
                print ("Great, you did it")
                break
            else:
                print ("Wrong, you stil have 2 tries")

                while True:
                    color_input = input ("Enter a color of the rainbow: ")
                    if color_input.lower() in rainbow:
                        print ("Great, you did it")
                        break
                    else:
                        print ("Wrong, last try")

                        while True:
                            color_input = input("Enter a color of the rainbow: ")
                            if color_input.lower() in rainbow:
                                print ("Great, you finally did it")
                                break
                            else:
                                print ("You ran out attemps. Sorry, you failed")
                                break
                        break
                break
        break


1 commentaires

Hé, pour quelqu'un qui a appris la programmation en quarantaine, vous avez bien fait. Mais il existe des moyens plus simples de le faire. Essayez de faire avec des compteurs.