Python, boucle while qui ne fonctionne pas

Résolu
Arkassus Messages postés 20 Statut Membre -  
Arkassus Messages postés 20 Statut Membre -

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. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984
     

    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
  2. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984
     

    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
  3. Arkassus Messages postés 20 Statut Membre
     

    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
  4. Arkassus Messages postés 20 Statut Membre
     

    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. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984
       

      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Arkassus Messages postés 20 Statut Membre
     

    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. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984
       

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

      0
      1. Arkassus Messages postés 20 Statut Membre > jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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
      2. jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention   9 984 > Arkassus Messages postés 20 Statut Membre
         

        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
      3. Arkassus Messages postés 20 Statut Membre > jee pee Messages postés 31892 Date d'inscription   Statut Modérateur Dernière intervention  
         

        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