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
6 réponses
Je dirais ce qui est plus facile à lire pour vous, en fonction de ce que sont a et b.
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.
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.
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.
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.
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.