Python, boucle while qui ne fonctionne pas

Résolu

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

  1. Modérateur

    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
    1. Modérateur

      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
      1. 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
        1. 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
          1. Modérateur

            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
        2. 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
          1. Modérateur

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

            0
          2. @jee pee

            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
          3. Modérateur
            @Arkassus

            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
          4. @jee pee

            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