python - not - Qué es más ''pitónico'' para ''no''
python logical operators example (4)
Lo he visto en ambos sentidos, pero ¿de qué manera es más pitónico?
a = [1, 2, 3]
# version 1
if not 4 in a:
print ''is the not more pythonic?''
# version 2
if 4 not in a:
print ''this haz more engrish''
¿Qué camino se consideraría mejor Python?
Aunque 4 not in a
a se prefiere cuando la elección se realiza de forma aislada, puede haber casos en los que la otra opción, not 4 in a
a, sea preferible.
Por ejemplo, si la especificación para el software está escrita para que not 4 in a
coincida con not 4 in a
entonces lo mejor sería dejarla coincidiendo con la especificación para ayudar al verificar el software contra la especificación.
Otro ejemplo es que una forma permite esta expresión de deterioro de la salud:
( 4 in well,
well,
not well,
not 4 in well) #!
Creo que not in
se usa más ampliamente.
Si bien la guía de estilo PEP 8 no analiza explícitamente el tema, sí lo considera como su propio operador de comparación .
No te olvides del Zen de Python . Uno de los principios fundamentales de la escritura de Python es que "la legibilidad cuenta", por lo tanto, escoja la opción que sea más clara de leer y comprender en su código.
La mayoría estaría de acuerdo en que 4 not in a
es más pitónico.
Python fue diseñado con el propósito de ser fácil de entender e inteligible, y 4 not in a
sonido más parecido a cómo lo dirías en inglés. ¡Lo más probable es que no necesites saber Python para entender lo que eso significa!
Tenga en cuenta que en términos de bytecode, los dos serán idénticos en CPython (aunque not in
es técnicamente un solo operador, not 4 in a
está sujeto a optimización):
>>> import dis
>>> def test1(a, n):
not n in a
>>> def test2(a, n):
n not in a
>>> dis.dis(test1)
2 0 LOAD_FAST 1 (n)
3 LOAD_FAST 0 (a)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(test2)
2 0 LOAD_FAST 1 (n)
3 LOAD_FAST 0 (a)
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
La segunda opción es más Pythonic por dos razones:
Es un operador que traduce a un operando de bytecode. La otra línea realmente
not (4 in a)
; dos operadores.Da la casualidad que Python optimiza el último caso y
not (x in y)
traducenot (x in y)
enx not in y
todos modos, pero ese es un detalle de implementación del compilador CPython.- Está cerca de cómo usarías la misma lógica en el idioma inglés.