La Loi de Morgan est-elle pythonique?

Laquelle des instructions if suivantes est plus pythonique?

if not a and not b:
    do_something

Ou

if not ( a or b ):
    do something

Ce n'est pas une logique de prédicat, donc je devrais utiliser les mots clés Python parce que c'est plus lisible?

Dans la solution ultérieure plus optimale que l'autre? (Je ne le crois pas.)

Y a - t-il des guides PEP-8 à ce sujet?

Code octet des deux approches (si cela compte):

In [43]: def func1():
    if not a and not b:
        return
   ....:     
   ....:     

In [46]: def func2():
    if not(a or b):
        return
   ....:     
   ....:     

In [49]: dis.dis(func1)
  2           0 LOAD_GLOBAL              0 (a)
              3 UNARY_NOT           
              4 JUMP_IF_FALSE           13 (to 20)
              7 POP_TOP             
              8 LOAD_GLOBAL              1 (b)
             11 UNARY_NOT           
             12 JUMP_IF_FALSE            5 (to 20)
             15 POP_TOP             

  3          16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        
        >>   20 POP_TOP             
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        

In [50]: dis.dis(func2)
  2           0 LOAD_GLOBAL              0 (a)
              3 JUMP_IF_TRUE             4 (to 10)
              6 POP_TOP             
              7 LOAD_GLOBAL              1 (b)
        >>   10 JUMP_IF_TRUE             5 (to 18)
             13 POP_TOP             

  3          14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        
        >>   18 POP_TOP             
             19 LOAD_CONST               0 (None)
             22 RETURN_VALUE        
24
demandé sur Bill the Lizard 2012-10-22 17:25:53

6 réponses

Je dirais ce qui est plus facile à lire pour vous, en fonction de ce que sont a et b.

15
répondu Mike Corcoran 2012-10-22 16:54:45

Je pense que vos deux exemples sont également lisibles, mais si je voulais "pousser le bateau" sur la lisibilité, j'irais avec:

not any((a, b))

puisque pour moi cela ressemble beaucoup plus à l'anglais, et est donc le plus pythonique.

15
répondu Andy Hayden 2012-10-22 13:51:54

Lequel utiliser? Celui qui est le plus lisible pour ce que vous essayez de faire.

Quant à ce qui est le plus efficace, le premier fait un not supplémentaire donc c'est techniquement moins efficace, mais pas si vous le remarquez dans une situation normale.

3
répondu kindall 2012-10-22 14:21:47

Ils sont équivalents, et si l'un est plus rapide que l'autre dépend des circonstances (les valeurs de a et b).

Il suffit donc de choisir la version que vous trouvez la plus lisible et/ou compréhensible.

1
répondu Roy Dictus 2012-10-22 13:28:47

J'aime personnellement l'approche Eiffel, mise en forme pythonique

Si a puis b: dosomething

Si a et b: dosomething

La première approche diffère de la seconde si a est faux. Il n'évalue pas b dans le premier cas, dans le second il le fait.

Le ou l'équivalent est "ou bien"

Http://en.wikipedia.org/wiki/Short-circuit_evaluation

Et/ou sont impatients.

Et puis/ou bien court-circuiter le évaluation

La bonne chose à propos de la syntaxe est qu'elle se lit bien, et qu'elle n'introduit pas de nouveaux mots-clés.

1
répondu Nickle 2012-10-22 14:19:12

Pour Qu'un morceau de code soit pythonique, il doit être à la fois agréable au lecteur en lui-même (lisible) et dans le contexte de son environnement (cohérent). Sans avoir le contexte de ce morceau de code, une bonne opinion est difficile à donner.

Mais, d'un autre côté... Si j'étais pythonique à mon avis, je devrais fonctionner de manière cohérente avec mon environnement, ce qui ne semble pas prendre en compte le contexte (par exemple L'OP).

Le premier.

0
répondu vrume21 2013-04-18 03:50:51