Python, boucle while qui ne fonctionne pas

Résolu/Fermé
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023 - 23 nov. 2022 à 17:47
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023 - 24 nov. 2022 à 12:21

Bonjour/bonsoir,

Je débute en Python et je suis entrain de coder un générateur de mot de passe.

J'ai décidé de créer mon programme sous forme de console, j'ai donc ajouté une boucle while permettant d'envoyer

un message d'erreur tant que l'utilisateur ne tape pas une commande valide.

Cependant, lorsque je tape '/help' qui est une commande valide, la boucle ne me renvoie pas le contenu de ma variable

help.

je vous joint une capture de mon code : 

Quelqu'un aurait-il une idée ?

Bonne soirée 

Arkassus

5 réponses

jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié le 23 nov. 2022 à 18:12

Bonjour,

Plutôt qu'une image, il faut poster le source (et les messages à l'exécution) en utilisant l’icône et le langage idoine. Ce qui donne :

reponse=""
while reponse not in ("oui","non"):
    reponse=input("question oui/non : ").lower()
print(reponse)

1
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié le 23 nov. 2022 à 18:36

ta boucle n'est pas correcte, soit tu fais comme mon exemple précédent, un not in, soit la condition doit être à chaque fois répétée et != et or ne vont pas ensemble, il faut != et and

user_entree = input(":")
while user_entree != "/help" and user_entree != "/generate" :
    print("cette commande n'est pas reconnue")
    user_entree = input(":")

user_entree = input(":")
while user_entree not in ("/help","/generate"):
    print("cette commande n'est pas reconnue")
    user_entree = input(":")


1
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023
23 nov. 2022 à 18:14

Ah oui pardon,

voilà mon code :

import random

letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
          "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
maj_letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
              "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
voyelles = ["a", "e", "i", "o", "u", "y"]
consonnes = ["b", "c", "d", "f", "g", "h", "j", "k", "l",
          "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z"]
maj_voyelles = ["A", "E", "I", "O", "U", "Y"]
maj_consonnes = ["B", "C", "D", "F", "G", "H", "J", "K", "L",
          "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Z"]
numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
special_characters = ["!", "?", "§", "#", "@", "&", "%", "ù", "µ"]
help_message = "tapez '/help' pour acceder à la liste des commandes "
help = """Bienvenue dans Unbreakable_Password_generator, voici la liste des commandes :
/help : affiche toutes les commandes ainsi que leur utilité
/generate : genere un mot de passe aleatoire avec par defaut 8 caracteres
/generate-c : genere un mot de passe aleatoire avec un nombre de caracteres au choix
/generate-e : genere un mot de passe facile à retenir, mais par consequent moins sur, il est compose de 8 caracteres
/generate-u : genere un mot de passe incassable(ou presque) contenant les caractères etendus de l'ASCII 8 bits et avec
par defaut 8 caracteres
/generate-u-c : genere un mot de passe incassable(ou presque) contenant les caractères etendus de l'ASCII 8 bits et avec
un nombre de caracteres au choix"""

user_entree = input(":")
while user_entree != "/help" or "/generate" or "/generate-c" or "/generate-e" or "/generate-u" or "/generate-u-c" :
    print("cette commande n'est pas reconnu")
    print(help_message)
    user_entree = input(":")

if user_entree == "/help":
    print(help)
elif user_entree == "/generate":
    alea = letters + maj_letters + numbers + special_characters
    password_aleatoire = (random.sample(alea, 10))
    print("voici votre mot de passe :" + str(password_aleatoire))
elif user_entree == "/generate-c":
    nb_caracteres = input("combien de caracteres souhaitez-vous ?")
    alea = letters + maj_letters + numbers + special_characters
    password_aleatoire = (random.sample(alea, int(nb_caracteres)))


alea = letters + maj_letters + numbers + special_characters
password_facile_a_memoriser = (random.sample(maj_voyelles, 1)) + (random.sample(consonnes, 1)) + (random.sample(voyelles, 1)) + \
                              (random.sample(consonnes, 1)) + (random.sample(voyelles, 1)) + (random.sample(numbers, 2)) + \
(random.sample(special_characters, 1))
password_aleatoire = (random.sample(alea, 10))

password_facile_a_memoriser = " ".join(password_facile_a_memoriser)
password_aleatoire = " ".join(password_aleatoire)

print (password_facile_a_memoriser)
print (password_aleatoire)

et le message à l'exécution ne me mentionne aucune erreur, il n'affiche juste pas le contenu de ma variable help

voilà le message à l'execution :

/help
cette commande n'est pas reconnu
tapez '/help' pour acceder à la liste des commandes 
0
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023
23 nov. 2022 à 18:42

D'accord je comprends mieux, merci beaucoup !

par contre je viens de me rendre compte d'un autre problème, comment faire pour que l'utilisateur revienne 

au début de ma boucle while une fois qu'il aura tapé /help ?

En batch j'aurais fais un "go to" pour retourner au début mais en python me voilà perdu xD

0
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié le 23 nov. 2022 à 19:09

Il faut apprendre sans goto ;-) c'est à dire que tout doit être régit par des blocs (if, while, ...) imbriqués les uns dans les autres, ou des fonctions

On peut faire un programme avec une boucle sans fin, et un break pour en sortir

while True:

....

   if .... :
      break

là tu peux mettre le if dans la boucle while

user_entree = input(":")
while user_entree not in ("/generate","/xxx"):
    if user_entree == "/help":
        print("help")
    else:
        print("cette commande n'est pas reconnue")
        print("help_message")
    user_entree = input(":")
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023
23 nov. 2022 à 19:33

ducoup j'ai fais ce que vous m'avez dis (enfin j'ai essayé ^^)

ce qui me donne cela :

user_entree = input(":")
while user_entree not in ("/help", "/generate", "/generate-c", "/generate-e", "/generate-u", "/generate-u-c"):
    if user_entree == "/help":
        print(help)
    elif user_entree == "/generate":
        alea = letters + maj_letters + numbers + special_characters
        password_aleatoire = (random.sample(alea, 8))
        password_aleatoire = " ".join(password_aleatoire)
        print("voici votre mot de passe :" + str(password_aleatoire))
    elif user_entree == "/generate-c":
        nb_caracteres = input("combien de caracteres souhaitez-vous ?")
        alea = letters + maj_letters + numbers + special_characters
        password_aleatoire = (random.sample(alea, int(nb_caracteres)))
        password_aleatoire = " ".join(password_aleatoire)
        print(password_aleatoire)
    elif user_entree == "/generate-e":
        password_facile_a_memoriser = (random.sample(maj_voyelles, 1)) + (random.sample(consonnes, 1)) + \
        (random.sample(voyelles, 1)) + (random.sample(consonnes, 1)) + (random.sample(voyelles, 1)) + \
        (random.sample(numbers, 2)) + (random.sample(special_characters, 1))
        password_facile_a_memoriser = " ".join(password_facile_a_memoriser)
        print(password_facile_a_memoriser)
    else:
        print("cette commande n'est pas reconnue")
        print(help_message)
    user_entree = input(":")

mais lorsque je rentre '/help', il stoppe juste le programme

0
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié le 23 nov. 2022 à 20:06

si tu regardes bien, je n'ai pas mis le /help dans le not in

0
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023 > jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024
23 nov. 2022 à 20:18

Dans ce cas là il faut que j'enlève toutes mes autres conditions de ma boucle while pour les mettrent sous forme de if 

mais je perd donc l'objectif initial qui était d'envoyer un message d'erreur si l'utilisateur appelait une autre commande 

que celles déjà existante 

Je pense qu'il y a quelque chose qui m'échappe...

0
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235 > Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023
24 nov. 2022 à 00:06

utilise le while pour le help et la mauvaise réponse, quand on en sort la demande saisie est correcte, tu peux alors traiter les différents cas, comme dans ton programme d'origine

1
Arkassus Messages postés 18 Date d'inscription mardi 1 février 2022 Statut Membre Dernière intervention 18 janvier 2023 > jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024
24 nov. 2022 à 12:21

c'est bon ça fonctionne enfin !

merci beaucoup de votre patience, 

Je pense avoir compris pas mal de choses grâce à vous :D

Bonne journée 

Arkassus

0