Pero, si es ambiguo para usted, el codificador, y debe ser porque tiene que preguntar, entonces espere que sea al menos tan ambiguo para el lector y desperdicie un par de octetos para mayor claridad.
Confiar en las reglas de prioridad es genial si usted es un compilador.
añaden las respuestas a los comentarios:
Para la persona de código que se encuentra con una ambigüedad que requiere la consulta fuera para el aseguramiento de la lectura, se debe asumir que el lector siguiente será menos inteligente que tú y los guarda el esfuerzo y error humano evitable de analizar el mismo constructo y agregar el paréntesis para ellos.
Ocurre que incluso la respuesta aceptada era incorrecta (por razones, no tiene efecto, mira su primer comentario) de la que no tenía conocimiento y tampoco una fracción de los que la votaron por encima.
En cuanto a la afirmación sobre el álgebra básica, el ejemplo particular utilizado en el OP es instructivo. Independientemente de la precedencia del operador, la expresión j * (j/m)
es algebraicamente idéntica a (j * j)/m
. Desafortunadamente, el álgebra de Python es solo una aproximación del álgebra "ideal platónico" que podría arrojar respuestas incorrectas para cualquiera de las formas dependiendo de las magnitudes de j
y m
. Por ejemplo:
>>> m = 1e306
>>> m
1e+306
>>> j = 1e307
>>> j
9.9999999999999999e+306
>>> j/m
10.0
>>> j*j
inf
>>> j * (j/m)
1e+308
>>> (j * j)/m
inf
>>> ((j * j)/m) == (j * (j/m))
False
Así que de hecho la propiedad de identidad de Python (y mi FPU) cuasi-álgebra no se sostiene. Y esto puede ser diferente en su máquina para que los documentation notes: números de punto
flotantes se implementan utilizando doble en C. Todas las apuestas en su precisión están apagados a menos que suceda a conocer la máquina que está trabajando .
Podría decirse que uno no tiene negocios que trabajan en el borde peluda de desbordamiento, y eso es cierto hasta cierto punto, pero retirado del contexto, la expresión es indeterminada dado una orden de operaciones y "correcta" en virtud de otro.
"Explicit is better than implicit.", "Ante la ambigüedad, rechace la tentación de adivinar". - PEP 20 – msw
british: Si estaba leyendo "code integer only", tiene un problema mucho mayor: ¿Qué versión de Python estaba destinada a ser utilizada para ejecutarla? ¿El código tiene 'desde __future__ división de importación' en el frente? ¿Debería leer '/' como y/o cambiarse a '//'? –
@John Machin:/significa división entera en ese caso, es python 2.6 sin las cosas del futuro, noté que los códigos como j * j/m (j * j)/m eran iguales, pero temía la consistencia si este comportamiento. –