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 :

if not e in l ou if e not in l ?


Sujet :

Python

  1. #1
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut if not e in l ou if e not in l ?
    Bonjour,

    Question perte de temps:
    ou ?

    @+
    Merci d'utiliser le forum pour les questions techniques.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    me parait plus logique... car on peut l'écrire comme ça:

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    C'est bien ce que je pense aussi vis à vis de la comparaison booléenne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> l = (1, 2)
    >>> e = 1
    >>> type(e in l)
    <type 'bool'>
    Pour ce qui est de if not (e in l)...
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 67
    Points
    67
    Par défaut
    Pour l'interpréteur cela ne fait aucune différence mais pour le lecteur humain ça sonne plus mieux bien avec if element not in iterable.

    La première forme reste claire et correspond plus à ce qui peut se faire dans d'autres langages. À condition de bien comprendre l'ordre dans lequel Python va traduire l'instruction :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (not e) in ls: # erreur d'interprétation humaine possible
        # ...
    if not (e in ls): # interprétation humaine correct
        # ...

    Ce n'est que mon avis. Mais en même temps je ne sais toujours pas pourquoi 42, alors je vous laisse juger de ma crédulité...

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Points : 168
    Points
    168
    Billets dans le blog
    1
    Par défaut
    [QUOTE=PauseKawa;6902021]C'est bien ce que je pense aussi vis à vis de la comparaison booléenne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> l = (1, 2)
    >>> e = 1
    >>> type(e in l)
    <type 'bool'>
    Bonjour PauseKawa,
    Il est normal de recevoir "type bool" à la question en ligne 3 puisque c'est "la comparaison" qui renvoie Vrai ou Faux selon le résultat. Si (1 est bien dans l, alors la condition est vraie).
    Un "Type (e)" renvoie un 'str', 'int', ... selon le formatage de la variable et de son contenu. Idem pour 'l'.

    A+

  6. #6
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonjour,

    Question perte de temps:
    ou ?

    @+
    le me parait plus mathématiques , tandis que le me semble linguistique, il est parfait pour des littéraires qui se mettent à coder
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    "not in" est un opérateur en tant que tel.
    Qu'on écrive "not z in L" où "z not in L": l’interpréteur générera les mêmes opcodes traduisant "z not in L".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def f1(z):
        if z not in L:
            pass
    génère les opcodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      4           0 LOAD_FAST                0 (z) 
                  3 LOAD_GLOBAL              0 (L) 
                  6 COMPARE_OP               7 (not in) 
                  9 POP_JUMP_IF_FALSE       15 
     
      5          12 JUMP_FORWARD             0 (to 15) 
            >>   15 LOAD_CONST               0 (None) 
                 18 RETURN_VALUE
    sous la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def f2(z):
        if not z in L:
            pass
    on obtient la même chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      8           0 LOAD_FAST                0 (z) 
                  3 LOAD_GLOBAL              0 (L) 
                  6 COMPARE_OP               7 (not in) 
                  9 POP_JUMP_IF_FALSE       15 
     
      9          12 JUMP_FORWARD             0 (to 15) 
            >>   15 LOAD_CONST               0 (None) 
                 18 RETURN_VALUE
    C'est la même chose pour "not z is L" vs. "z is not L": "is not" est aussi un opcode.

    Ceci dit "not in" et "is not" existent dans l'espoir que les codes soient plus lisibles. Et je pense qu'il est plus lisible de... (dans la plupart des cas).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 211
    Points : 168
    Points
    168
    Billets dans le blog
    1
    Par défaut Ouf ! Ça me rassure ;-)
    Bonjour wiztricks,

    Merci pour cette réponse "rassurante"

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    @wiztricks : J'avais hésité un moment avant de dire dans le sujet que le code est le même pour l’interpréteur au vu de dis au cas ou cela empêche une réponse.

    @ll : La question ne porte en effet pas sur le code lui même mais la présentation de celui ci. En fait une application d'import this / du pythonesque à la présentation du code.

    Pour ma part je pense que la forme if not <condition> et bien plus proche de l'esprit du langage.

    Dans l'attente d'autre avis je vais faire mon yoga

    @+
    Merci d'utiliser le forum pour les questions techniques.

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Je me demande si Python n'as pas lui même donner la réponse...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                  6 COMPARE_OP               7 (not in)
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Pour ma part j'utilise toujours la forme not in parce que:
    1. c'est plus lisible
    2. je n'arrive jamais à retenir la priorité des opérateurs, et je suis trop fainéant pour vérifier ou pour mettre des parenthèses

  12. #12
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut Explicit is better than implicit
    Bonjour,

    Citation Envoyé par dividee Voir le message
    c'est plus lisible
    Il me semble que c'est une grande partie de la réponse, l'interprétation du code par Python n'ayant rien a faire de mes états d’âme et l'opérateur not in étant interprété de la même façon (valable aussi pour la comparaison d'identité is not).
    Le code étant le même toute considération de performance n'as lieu d’être ici, si ce n'est le fait de devoir ou pas parcourir la collection au complet, soit utiliser in ou pas.

    Une autre considération est de savoir s'il est utile ou pas de construire la collection si celle ci n'existe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> a = 0
    >>> b = 1
    >>> False in (a, b)
    True
    >>> False not in (a, b)
    False
    >>> a and b
    0
    (or considération not a and a is not None)
    Je pense que cela sera justifié, au final, par Simple is better than complex (on en reviens à la lecture).

    Pour moi if not doit être utiliser pour le True/False implicite (if not foo) et not in pour "l'appartenance" (in). Cela reviens a
    Citation Envoyé par dividee Voir le message
    je n'arrive jamais à retenir la priorité des opérateurs, et je suis trop fainéant pour vérifier ou pour mettre des parenthèses
    C'est explicite pour le lecteur (on a notre import this ).

    Citation Envoyé par PauseKawa Voir le message
    Pour ma part je pense que la forme if not <condition> est bien plus proche de l'esprit du langage.
    Reste donc vrais dans le cadre booléen mais sa lecture n'est pas équivalente à not in qui implique l'appartenance ou pas.

    Citation Envoyé par afranck64 Voir le message
    le me parait plus mathématiques , tandis que le me semble linguistique, il est parfait pour des littéraires qui se mettent à coder
    Je pense que c'est une erreur.
    Le coding style Python dit que if a est préférable à if a != None et en bon pythons on applique cela à tour de bras sans prendre en compte le contexte / la lisibilité du code (Readability counts).
    En fait ce qui nous parait plus 'mathématique' dans ce cas c'est le booléen implicite, on en oubli le contexte.
    De plus l'interprétation de code retrouvant l'opérateur not in dans tous les cas autant l'utiliser directement.
    Après cela qu'importe si cela ressemble à du shakespeare si c'est compréhensible/le message passe pour le lecteur/Python ?

    Citation Envoyé par PsycoPy Voir le message
    La première forme reste claire et correspond plus à ce qui peut se faire dans d'autres langages. À condition de bien comprendre l'ordre dans lequel Python va traduire l'instruction
    Il la comprendras tel que vous lui présenterez, l'erreur venant du programmeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> l = (0, 1, 2)
    >>> not (0 in l)
    False
    >>> (not 0) in l
    True
    >>> (not 5) in l
    True
    La priorité des opérateurs de dividee ne pouvant pas s'appliquer à not in celui ci est préférable.

    @+
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. Treeview or not Treeview
    Par Hyedene dans le forum IHM
    Réponses: 3
    Dernier message: 04/04/2003, 15h56
  2. TXMLModule.create - name = resource not found
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/03/2003, 10h54
  3. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 06h48
  4. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 14h40
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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