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 :

pb condition sur chaine de caractères


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut pb condition sur chaine de caractères
    Bonjour,

    Voici mon code qui va bien vous faire rire, ben je débute, c'est juste pour savoir si un caractère ("x") est présent dans ma chaine ("Stephen king"), que je mette une bonne ou une mauvaise lettre, la réponse est toujours "OK", alors que si je fait print(caract in chaine), Python me renvoi bien False, je comprend pas ou est le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def foncTrouve(chaine,caract):
        if caract in chaine==False:
            print("Caractères non présent !")
            exit()
        else:
            print("OK")
     
    a="Stephen King" 
    foncTrouve(a,"x")

  2. #2
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    Bonjour, le problème vient de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if caract in chaine==False:
    la syntaxe que tu cherche est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if caract not in chaine:

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    Merci Zancrows pour ton temps et ta réponse explicite.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Bonjour,

    La syntaxe proposée par zancrows est à priviligier
    Néanmoins, il est intéressant de comprendre pourquoi ton code ne te donne pas le résultat attendu
    En effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a="Stephen King" 
    print("x" in a)
    donne bien False!

    Mais alors pourquoi print("x" in a == False) donne False

    La réponse est simple: c'est la priorité des opérateurs
    En effet == est prioritaire sur in donc a== False est évalué en premier puis on regarde si "x" est dans le résultat de l'évaluation
    or a != False donc le résultat de a==False est False
    et évidemment il n'y a pas le caractère x dans la valeur booléenne False

    En résumé, tu aurais ajouté des parenthèses dans ton test et ta fonction aurait retournée le résultat désiré

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def foncTrouve(chaine,caract):
        if (caract in chaine) == False:
            print("Caractères non présent !")
            exit()
        else:
            print("OK")
     
    a="Stephen King" 
    foncTrouve(a, "x")
    renvoie bien "Caractères non présent"

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    D'accord, merci
    très interessant, je n'avais pas pensé à cela !

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Nom Voir le message
    Mais alors pourquoi print("x" in a == False) donne False
    La réponse est simple: c'est la priorité des opérateurs
    loupé ! ça n'est pas ça

    pour s'en convaincre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> False == False in [False]
    True
    s'il s'agissait de la précédence des opérateurs on devrait alors évaluer tel que False == False (donc True) puis True in [False]
    et donc le résultat final devrait être False

    en fait c'est plus retord que ça, quand on écrit "x" in a == False c'est comme quand on écrit x < y < z (cette notation est autorisée en Python pour rappel), ça équivaut à (x < y) and (y < z)

    de la même façon "x" in a == False est équivalent à ("x" in a) and (a == False), cqfd...

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    s'il s'agissait de la précédence des opérateurs on devrait alors évaluer tel que False == False (donc True) puis True in [False]
    et donc le résultat final devrait être False
    Un problème de précédence d'opérateurs se résout avec des parenthèses (elles sont là pour bidouiller la précédence "par défaut") i.e. ('x' in a) == False.

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

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Merci à vous 2; j'ai (encore) appris quelque chose

    Désolé pour la mauvaise explication

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. condition sur chaine de caractère
    Par trax44 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 24/01/2007, 15h12
  2. Condition avec chaine de caractère
    Par davelop dans le forum ASP
    Réponses: 1
    Dernier message: 13/09/2006, 12h15
  3. Travail sur chaines de caractères
    Par g.greg45 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2006, 19h11
  4. Travail sur chaine de caractère
    Par corben dallas dans le forum Access
    Réponses: 4
    Dernier message: 02/01/2006, 19h22
  5. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14

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