105 votes

Ordre de syntaxe d'utilisation des mots clés "not" et "in"

Lors de la vérification de mon adhésion, je ne sais pas s'il faut utiliser:

 'ham' not in 'spam and eggs'
 

Ou bien:

 not 'ham' in 'spam and eggs'
 

Mon niveau d'indécision semble fluctuer selon que je vérifie les sous-chaînes, le contenu de la liste, les clés du dictionnaire ... et le nombre de cafés que j'ai reçus.

  1. Ces deux formes sont-elles toujours équivalentes? Et si oui ..
  2. Y a-t-il une référence quelque part dans la documentation de la syntaxe préférée?

116voto

Ben Points 22160

Ils donnent toujours le même résultat.

En fait, not 'ham' in 'spam and eggs' semble être spécial tubé pour effectuer un simple "non", plutôt que "dans" opération et en niant le résultat:

>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 POP_TOP             
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE      

J'avais pensé au début qu'ils ont toujours donné le même résultat, mais qu' not sur son propre était tout simplement un faible priorité logique de la négation de l'opérateur, qui pourrait être appliquée à d' a in b aussi facilement que toute autre expression booléenne, alors qu' not in a été séparé de l'opérateur pour plus de commodité et de clarté.

Le démontage ci-dessus a été révélateur! Il semble que tout not est de toute évidence une logique opérateur de négation, de la forme not a in b est spécial emballé de sorte qu'il n'est pas réellement en utilisant le général d'opérateur. Cela rend not a in b littéralement la même expression que a not in b, plutôt que de simplement une expression qui donne la même valeur.

18voto

icktoofay Points 60218

  1. Non, il n'y a pas de différence.

    L'opérateur not in est défini pour avoir la valeur vraie inverse de in .

    - documentation Python

  2. Je suppose que not in est préféré car il est plus évident et ils ont ajouté un cas spécial pour cela.

3voto

Tomas Lycken Points 23432

D'autres l'ont déjà fait, il est très clair que les deux états sont, jusqu'à un très faible niveau équivalent.

Cependant, je ne pense pas que quelqu'un a assez souligné que, depuis, ce qui laisse le choix à vous, vous devez

choisissez la forme qui rend votre code aussi lisible que possible.

Et pas nécessairement aussi lisible que possible à toute personne, même si c'est naturellement une bonne chose à viser. Non, assurez-vous que le code est aussi lisible que possible pour vous, puisque vous êtes celui qui est le plus susceptible de revenir à ce code et essayer de le lire.

2voto

En Python, il n'y a pas de différence. Et il n'y a pas de préférence.

1voto

Makoto Points 23751

Syntaxiquement, ils sont la même déclaration. Je dirais rapidement que 'ham' not in 'spam and eggs' traduit une intention plus claire, mais j'ai déjà vu du code et des scénarios dans lesquels not 'ham' in 'spam and eggs' véhicule un sens plus clair que l'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X