IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Structure conditionnelle if à corriger


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut Structure conditionnelle if à corriger
    Bonjour à tous,

    J'aimerais corriger la structure conditionnelle if dans ce bout de code, ou l'utilisateur doit choisir dans un menu entre 1 et 5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    choix = ""
    while choix !=5:
        choix = input ("VOtre choix : ")
        if choix[0] < "1" and choix[0] > "5" \
            and not choix[0] == " " and len(choix) == 1:
            print("doit être entre 1-5. Essayez à nouveau"
        else: '''En cas ou choix = 5'''
            print("A bientôt !")
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Si vous ne convertissez pas choix, chaîne de caractères, en un entier, tester qu'elle est de longueur 1 et que c'est une sous chaîne de "12345" (ou "1" <= choix <= "5") suffirait (modulo la condition de sortie...).
    Si vous la convertissez en entier, le test sera 1 <= choix <= 5.

    A vous de corriger...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Il va falloir bosser les tutos !
    Une proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    choix = 0
    while choix not in [1,2,3,4,5]:
        question = input("Entre un choix ")
        choix = int(question)
    print("choix : ", choix)

  4. #4
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Autre proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (choix := input("Entre un choix entre 1 et 5:")) not in "12345":
    	print('erreur de saisie! doit être entre 1-5. Essayez à nouveau')
     
    print("Votre choix:",choix)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Autre proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (choix := input("Entre un choix entre 1 et 5:")) not in "12345":
    	print('erreur de saisie! doit être entre 1-5. Essayez à nouveau')
     
    print("Votre choix:",choix)
    ça ne marche pas car l'omission de test sur la longueur autorise "123" à être une réponse correcte.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 923
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    ça ne marche pas car l'omission de test sur la longueur autorise "123" à être une réponse correcte.

    - W
    Je n'avais effectivement pas pensé à ce cas de figure

  7. #7
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour ,

    J'ai modifié la condition de if en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(choix) != 1 and choix not in "12345" and not choix == " ":
    Mais cette condition ne teste que si l'entrée est à deux chiffres !

    Texte affiché :
    --| Votre choix doit être, entre 1-5
    --| Ressayez.
    Une entrée d'espace ou de caractère n'est pas traitée.

    Voici le texte affiché :
    Ressayez !
    Pour avoir un bon aperçu, voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    liste=[]
    choix = ""
    while choix not in "12345":
        print("------------------------------------")
        print("1: Ajouter un élément à la liste")
        print('2: Retirer un élément de la liste')
        print("3: Aficher la liste")
        print("4: Vider la liste")
        print("5: Quitter")
     
        choix = input ("Votre choix : ")
     
        if len(choix) != 1 and choix not in "12345" and not choix == " ":
            print("--| Votre choix doit être, entre 1-5")
            print("--| Ressayez.") 
     
        elif choix == "1":
        ...
        elif choix == "2":
        ...
        elif choix == "3":
        ...
        elif choix == "4":
        ...
        elif choix == "5":
            print('A bientôt !')
            break
        else:
            print('Ressayez !')

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par apt Voir le message
    Mais cette condition ne teste que si l'entrée est à deux chiffres !
    oui, tout a fait normal car tu utilises des ET dans ta condition/test

    je suppose que tu désirais : si pas de longeur 1 OU pas dans "1..5" OU ... alors j'ai une erreur.
    Note , puisque tu utilises des chaines, il est bon de supprimer les espaces avant ta condition
    Note: le jour ou tu as 10 entrées, ta logique devient mauvaise, donc si le menu peut grandir, ce n'est pas pas la meilleure solution (travail sur chaine)

    pour info ... avec python 3.10 existe maintenant "match"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    match entry:
        case "1":
            print("call ", "Function_1")
        case "5":
            exit(5)
        case _:
            print("pas dans menu...")

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par apt Voir le message
    J'ai modifié la condition de if en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(choix) != 1 and choix not in "12345" and not choix == " ":
    Mais cette condition ne teste que si l'entrée est à deux chiffres !
    Pourquoi faire compliqué avec 3 tests pour une évaluation (à savoir un choix faisant partie de valeurs autorisées) ???
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    liste=[]
    while True:
    	print("------------------------------------")
    	print("1: Ajouter un élément à la liste")
    	print('2: Retirer un élément de la liste')
    	print("3: Aficher la liste")
    	print("4: Vider la liste")
    	print("5: Quitter")
     
    	choix = input ("Votre choix : ")
     
    	if choix not in ("1", "2", "3", "4", "5"):
    		print("--| Votre choix doit être, entre 1-5")
    		print("--| Ressayez.") 
     
    	elif choix == "1":
    		print(1)
    	elif choix == "2":
    		print(2)
    	elif choix == "5":
    		print('A bientôt !')
    		break
    	else:
    		print('Ressayez !')

    Après, pour faire plus indépendant, tu peux gérer la saisie dans une fonction chargée de vérifier avant de renvoyer. Et tu passes à la fonction juste ta liste de choix et elle, elle s'adapte à la liste...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    def menu(prop):
    	while True:
    		print("------------------------------------")
    		for (k, v) in prop.items(): print("%s: %s" % (k, v))
    		choix = input ("Votre choix : ")
    		if choix in prop.keys(): return choix
    		print("--| Votre choix doit être, entre %s-%s" % (tuple(prop.keys())[0], tuple(prop.keys())[-1]))
    		print("--| Ressayez.") 
    	# while
    # menu()
     
    liste=[]
    while True:
    	choix=menu(
    		{
    			"1" : "Ajouter un élément à la liste",
    			"2" : "Retirer un élément de la liste",
    			"3" : "Aficher la liste",
    			"4" : "Aficher la liste dans l'autre sens",
    			"5" : "Vider la liste",
    			"6" : "Quitter",
    		}
    	)
    	if choix == "1":
    		print(1)
    	elif choix == "2":
    		print(2)
    	elif choix == "6":
    		print('A bientôt !')
    		break
    	else:
    		print('Ressayez !')

    Citation Envoyé par apt Voir le message
    ... and not choix == " ":
    ... and choix != " ":
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour papajoker, sve@r,

    Citation Envoyé par papajoker
    Note: le jour ou tu as 10 entrées, ta logique devient mauvaise, donc si le menu peut grandir, ce n'est pas pas la meilleure solution (travail sur chaine)

    pour info ... avec python 3.10 existe maintenant "match"
    Merci pour l'astuce

    Citation Envoyé par sve@r
    Pourquoi faire compliqué avec 3 tests pour une évaluation (à savoir un choix faisant partie de valeurs autorisées) ???
    Cela explique pourquoi la structure conditionnelle ne fonctionne pas !

    Merci pour le code

    Citation Envoyé par sve@r
    Après, pour faire plus indépendant, tu peux gérer la saisie dans une fonction chargée de vérifier avant de renvoyer. Et tu passes à la fonction juste ta liste de choix et elle, elle s'adapte à la liste...
    Je vais prendre un peu plus de temps pour bien comprendre comment cela fonctionne

    Citation Envoyé par sve@r
    ... and choix != " ":
    Cela fait partie d'un bout de code extrait à partir de Stack Overflow.

    J'ai essayé le code sans recourir au traitement des entrées via des chaînes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    liste=[] 
    while True:
        print("------------------------------------")
        print("1: Ajouter un élément à la liste")
        print('2: Retirer un élément de la liste')
        print("3: Aficher la liste")
        print("4: Vider la liste")
        print("5: Quitter")
     
        choix = int(input("Votre choix : "))
     
        if choix not in (1, 2, 3, 4, 5):
            print("--| Votre choix doit être entre 1-5")
            print("--| Ressayez.") 
     
        elif choix == 1:
            print(1)
        elif choix == 2:
            print(2)
        elif choix == 5:
            print("A bientôt !")
            break
        else:
            print("Ressayez !")
    Je pense que c'est nettement mieux ainsi

Discussions similaires

  1. IF ( Structure conditionnelle ) MYSQL
    Par Eric45 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 26/08/2013, 18h59
  2. [VBA-E]Structure conditionnelle sur plusieurs variables
    Par rodrigue62 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/07/2007, 14h30
  3. structure conditionnelle dans la clause where
    Par liberty74 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2007, 23h18
  4. [XSLT]la structure conditionnelle.
    Par Extra-Nitro dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 22/08/2006, 13h46
  5. [Language][Compilateur]Objets et structures conditionnelles
    Par goran kajfes dans le forum Langage
    Réponses: 5
    Dernier message: 30/11/2005, 22h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo