No era consciente de esto, pero aparentemente las palabras clave and
y or
no son operadores. No aparecen en el list of python operators. Solo por pura curiosidad, ¿por qué es esto? Y si no son operadores, ¿qué son exactamente?¿Por qué los operadores "y" y "o" no están en Python?
Respuesta
Porque son construcciones de flujo de control. Específicamente:
- si el argumento izquierdo para
and
se evalúa como falsa, el argumento de la derecha no se evalúan en absoluto - si el argumento izquierdo para
or
se evalúa como True, el argumento de la derecha no consigue evaluado en todo
Por lo tanto, no es simplemente una cuestión de palabras reservadas. No se comportan como operadores, ya que los operadores siempre evalúan todos sus argumentos.
Se puede comparar esto con bit a bit operadores binarios que, como su nombre lo indica, son operadores:
>>> 1 | (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 1 or (1/0)
1
Como se ve, el operador OR (|
) evalúa tanto sus argumentos. La palabra clave or
, sin embargo, no evalúa su argumento correcto cuando el argumento de la izquierda se evalúa como True; es por eso que no se plantea ZeroDivisionError
en la segunda declaración.
Están clasificándolos como palabras clave anteriormente en el documento.
Cierto, pero eso en realidad no significa nada más que no se pueden usar como nombres de variables. –
La URL a la que se vincula el OP tiene que ver con el análisis léxico, y léxicamente, son palabras clave, no operadores. Si la pregunta fue redactada como una de sintaxis, entonces el voto abajo tendría sentido. – Jacob
Son keywords, porque son identificadores reservados, no tokens especiales de símbolos.
No se pueden redefinir para admitir operaciones específicas del tipo, por lo que no entran en el ámbito de los otros operadores.
Sospecho que tu relación de causalidad es incorrecta. No se pueden redefinir para admitir operaciones específicas de tipo porque no son operadores. –
Python no proporciona actualmente ningún 'xxx' métodos especiales correspondientes a la 'y', 'o' y 'no' operadores booleanos. En el caso de 'y' y 'o', la razón más probable es que estos operadores tengan semántica de cortocircuito, es decir, el segundo operando no se evalúa si el resultado puede determinarse a partir del primer operando. La técnica habitual de proporcionar métodos especiales para estos operadores, por lo tanto, no funcionaría.
Fuente: PEP 335
PEP 335 habla de la adición de la capacidad de tener operadores sobrecargable, y trata este problema un poco.
- 1. ¿Qué operadores lógicos de C++ usa: y, o, no, y los operadores de estilo il o C? ¿por qué?
- 2. ¿Qué hacen los operadores '& =' y '= &'?
- 3. ¿Por qué no hay operadores || = o && = en C#?
- 4. ¿Por qué los operadores XPath distinguen entre mayúsculas y minúsculas?
- 5. pitón y/o operadores de valor
- 6. ¿Por qué no puedo definir operadores implícitos y explícitos?
- 7. + =, +, == y = operadores
- 8. ¿Por qué los eventos y comandos en MVVM no están soportados por WPF/Visual Studio?
- 9. ¿Por qué los lenguajes dinámicos como Ruby y Python no tienen el concepto de interfaces como en Java o C#?
- 10. ¿Qué caracteres están permitidos para los operadores de Haskell?
- 11. ¿Por qué no se ven los patrones de MVP y MVVM en Ruby, Python o PHP?
- 12. ¿Por qué están relacionados SDL y OpenGL?
- 13. D operadores que no están en C++
- 14. ¿Por qué los inicializadores designados no están implementados en g ++
- 15. operadores consecutivos y los soportes
- 16. ¿Qué hacen los operadores * = y = * en T-SQL?
- 17. ¿Por qué UIFont y CGFont/CTFont están separados por completo?
- 18. ¿Por qué no hay operadores de cortocircuito elevados en `bool?`?
- 19. jQuery seleccionar por atributo usando los operadores AND y OR
- 20. && = y = || operadores
- 21. ¿Qué hacen los operadores% y %% cuando configuran las dependencias SBT?
- 22. ¿Qué significan los operadores% op% en R? Por ejemplo, "% en%"
- 23. Ruby - saltos de línea y los operadores
- 24. C preprocesador # y ## operadores
- 25. RedirectToAction() vs. View() y los operadores ternarios?
- 26. ¿Qué son los "patrones n + k" y por qué están prohibidos en Haskell 2010?
- 27. ¿Qué es la asociatividad de los operadores y por qué es importante?
- 28. ¿Cuáles son los operadores y comandos admitidos en FQL?
- 29. ¿Por qué no es la función 'len' heredada por los diccionarios y listas en Python
- 30. ¿Qué son los operadores levantados?
Nota, en C, '&&' y '||' se llaman "operadores" aunque estén en cortocircuito (no evalúe el lado derecho según el valor del lado izquierdo). Del mismo modo para algunos otros idiomas. –
Sí, acepto que la terminología puede variar. Sin embargo, el punto principal es que tienen características fundamentalmente diferentes a las que Python generalmente llama operadores. –