python - claves - palabras reservadas y su significado
Orden de sintaxis para usar palabras clave ''no'' y ''in'' (6)
Al probar la membresía, podemos usar:
x not in y
O alternativamente:
not y in x
Puede haber muchos contextos posibles para esta expresión según y
. Podría ser para un control de subcadena, membresía de lista, existencia de clave dict, por ejemplo.
- ¿Son las dos formas siempre equivalentes?
- ¿Hay una sintaxis preferida?
En Python, no hay diferencia. Y no hay preferencia
Otros ya han dejado muy claro que las dos declaraciones son, hasta un nivel bastante bajo, equivalentes.
Sin embargo, no creo que nadie haya enfatizado lo suficiente, ya que esto le deja la elección a usted, usted debería
elija la forma que hace que su código sea lo más legible posible.
Y no necesariamente tan legible como sea posible para nadie , incluso si eso es, por supuesto, algo bueno para apuntar. No, asegúrese de que el código sea lo más legible posible para usted , ya que usted es el que tiene más probabilidades de volver a este código más adelante e intentar leerlo.
Siempre dan el mismo resultado.
De hecho, not ''ham'' in ''spam and eggs''
parece tener un diseño especial para realizar una única operación "no en", en lugar de una operación "en" y luego anular el resultado:
>>> 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
Al principio pensé que siempre daban el mismo resultado, pero que not
era solo un operador de negación lógica de baja precedencia, que podía aplicarse a a in b
tan fácilmente como a cualquier otra expresión booleana, mientras que not in
era un operador separado por conveniencia y claridad.
¡El desmontaje de arriba fue revelador! Parece que si bien not
es obviamente un operador de negación lógica, la forma not a in b
tiene una cubierta especial, por lo que no está realmente utilizando el operador general. Esto hace que not a in b
literalmente, la misma expresión que a not in b
, en lugar de simplemente una expresión que da como resultado el mismo valor.
Sintácticamente son la misma declaración. Me apresuraría a decir que ''ham'' not in ''spam and eggs''
transmite una intención más clara, pero he visto códigos y escenarios en los que not ''ham'' in ''spam and eggs''
transmite un significado más claro que el otro.
Tienen un significado idéntico, pero el verificador de guía de estilo pep8 Python prefiere el operador no en la regla E713 :
E713: prueba de membresía no debe estar
not in
Ver también "Python if x is not None
o if not x is None
?" para una elección de estilo muy similar.
- No, no hay diferencia.
El operador
not in
está definido para tener el verdadero valor inverso dein
. - Supongo que
not in
es preferible porque es más obvio y agregaron un caso especial para ello.