[Python-es] Python 3.5.2

Johnny Alonso johnny.alonso.quintero en gmail.com
Dom Dic 25 09:24:43 EST 2016


Hola Ricardo, facilítame la vida, indícame quien está mal con respecto a las matemática, las calculadoras o Python, espero que la respuesta no sea “ninguna” porque entonces tendría que afirmar que sabía más antes de preguntar.
Saludos, Johnny Alonso
 
De: Python-es [mailto:python-es-bounces+johnny.alonso.quintero=gmail.com en python.org] En nombre de Miguel Manzano
Enviado el: domingo, 25 de diciembre de 2016 1:55 a. m.
Para: La lista de python en castellano
Asunto: Re: [Python-es] Python 3.5.2
 
Ricardo y David. Nunca pensé que iba a disfrutar tanto de una conversación sobre precedencia de operadores. ;P
 
Saludos.
 
El 25/12/2016 7:15, "Ricardo Cárdenes" < <mailto:ricardo.cardenes en gmail.com> ricardo.cardenes en gmail.com> escribió:
Añado, al respecto de calculadoras: en una normal, donde no se pueden introducir expresiones aritméticas, sino que lo que hay en pantalla se toma siempre como un operando completo, hubiese esperado lo contrario, ya que estoy solicitando explícitamente elevar al cuadrado el número -2 y entonces no hay ningún tipo de duda de que el resultado será "4" y no "-4"
 
2016-12-24 20:05 GMT-10:00 Ricardo Cárdenes < <mailto:ricardo.cardenes en gmail.com> ricardo.cardenes en gmail.com>:
Mire señor Alonso, yo no le he respondido a la ligera.
 
Primero, como le dije, el caso de Python no es una excepción, sino *la regla* en cuanto a lenguajes de programación *que implementan la exponenciación* en su sintaxis - es decir, la precedencia está dictada por el propio lenguaje. Es decir, no lo busque en C, o en C++, o en Java, etc. De hecho, me molesté en documentarme brevemente antes de responder. Y mira que no hay muchos lenguajes que implementen la exponenciación en su sintaxise, pero le dejo una lista (no exhaustiva), sin irme a casos demasiado exóticos:
 
  - ADA: los operadores de MAYOR precedencia son abs (valor absoluto), not (negación lógica) y ** (exponenciación). Dos niveles por encima de los operadores unarios, y uno por encima de la multiplicación/división.
  - D: El operador ^^ (exponenciación) está un nivel por encima de los unarios
  - FORTRAN: El operador ** tiene la precedencia más alta
  - Haskell: Los operadores ^, ^^ y ** (todos de exponenciación) están por debajo sólo de "!!", que se usa para acceder a los índices de arrays
  - PHP: ** está por encima de todos los demás operadores aritméticos (y mira que le tengo tirria a este lenguaje, pero por una vez...)
  - Python (pero esto ya lo sabíamos): ** está, como viene siendo habitual, por encima de los unarios, pero por debajo de los operadores de indización
  - R: ^ (exponenciación), está justo por encima de + y - unarios
  - Ruby: ** está justo por encima del - unario (pero justo por debajo del + unario, cosas de la vida)
 
Casos que conozco donde la precedencia de los unarios está por encima: Prolog, JavaScript y algunos casos patológicos como Excel (véase más abajo).
 
En cuanto a calculadoras, he usado la que tengo más a mano (en mi teléfono móvil) y:
 
   -4^2 = -16
   (-4)^2 = 16
 
tal como esperaba.
 
Y en el caso de las matemáticas, don Aurelio Baldor (al que no conocía, por cierto) podrá cantar misa en Latín, pero cualquier de mis profesores de matemáticas me hubiera tirado de las orejas si se ocurre interpretar que:
 
    -x^n = (-x)^n
 
Aunque claro, siempre me animaron a usar paréntesis para que no cupiera duda.
 
Si es cuestión de sacar referencias, pues nada. Citemos Wikipedia, que a su vez usa como referencias "Elementary Algebra for College Students" (Angel Allen) y "Taschebuch der Mathematik" (Grosche, Ziegler y Ziegler):
 
There exist differing conventions concerning the unary operator − (usually read "minus"). In written or printed mathematics, the expression −32 is interpreted to mean 0 − (32) = −9, but in some applications and programming languages, notably Microsoft Office Excel (and other spreadsheet applications) and the programming language bc [...]
 
Las negritas son mías, pero vamos, que la norma la que decimos nosotros, aunque algunos lenguajes de programación han escogido usar la convención contraria. Y Baldor, según vd., aunque la única copia a la que tenido acceso es una edición de 1985-86, en la que el capítulo XV no empieza hasta la página 155 y no aparece un sólo número negativo.
 
Saludos,
Ricardo
 
2016-12-24 6:52 GMT-10:00 Johnny Alonso < <mailto:johnny.alonso.quintero en gmail.com> johnny.alonso.quintero en gmail.com>:
Hola Ricardo y Armando, si las expresiones que muestran son código Python, lamento decirles que están bastante lejos de la realidad.
Están comparando expresiones con operadores diferentes y que el resultado en ocasiones les coincida es mera casualidad.
En Python el operador ** es potenciación y ^ equivale a la operación XOR entre bist.
>>> -2**2
-4
>>> -(2^2)
0
Armando ni siquiera coinciden los resultados, dándote el beneficio de la duda, y utilizas el ^ como operador de potenciación, entonces:
La expresión -(2^2) en Python equivale a:
>>> -(2**2)
-4
Aquí los resultados con el operador ** coinciden, -4 en ambos casos, y lo acepto como correcto desde el punto de vista del lenguaje, pero no desde el punto de vista matemático, pues matemáticamente las expresión -2² es diferente a -(2²).
Los desarrolladores de lenguajes son libres de incorporar lo que desean, esto también aplica para la precedencia de operadores y el sentido de evaluación de las expresiones matemáticas, pero de igual forma lo documentan para que los usuarios no incurramos en errores asumiendo que todos cumplen las reglas de evaluación matemática al pie de la letra.
 
Conjetura: Python no implementa el operador menos unario, pero si el binario el cual tiene menor precedencia que el de potenciación, así:
-x**n es interpretado en Python como 0-x**n.
>>> -2**2
-4
>>> 0 - 2**2
-4
 
Saludos, Johnny Alonso
 
 
De: Python-es [mailto: <mailto:python-es-bounces%2Bjohnny.alonso.quintero> python-es-bounces+johnny.alonso.quintero= <mailto:gmail.com en python.org> gmail.com en python.org] En nombre de Armando Ortega
Enviado el: sábado, 24 de diciembre de 2016 6:24 a. m.

Para: La lista de python en castellano
Asunto: Re: [Python-es] Python 3.5.2
 
Buenos días.

Ricardo tiene razón. 

-2**2 = -(2^2) = -4
(-2)**2 = -2^2 = 4

Un saludo.
El 24/12/16 a las 04:54, Johnny Alonso escribió:
Hola Ricardo, Por definición “La potencia es resultado de tomar un número como factor 2 o más veces”. Aritmética de Baldor, capítulo XV, Elevación a potencias y sus operaciones inversas, página 152.
 
-2**2 = -2 * -2 
 
Leyes de la potenciación:
Todo número elevado a la cero  es igual a 1, x**0 = 1
-2**0 = 1
 
Todo número elevado a un exponente par (múltiplo de 2) es positivo, en caso contrario se mantiene el signo del número.
-2**2 = 4
-2**3 = -8
 
Lo anterior lo puedes verificar en la calculadora de un celular IPhone o Samsung, incluso en la de Windows.
 
Es evidente que en Python es así, y lo acepto porque así está documentado, pero es algo para tener en cuenta cuando programas en él.
 
Ricardo, con respecto a las matemáticas en este caso, estas equivocado.
 
Saludos, Johnny Alonso
De: Python-es [ <mailto:python-es-bounces+johnny.alonso.quintero=gmail.com en python.org> mailto:python-es-bounces+johnny.alonso.quintero=gmail.com en python.org] En nombre de Ricardo Cárdenes
Enviado el: viernes, 23 de diciembre de 2016 5:04 p. m.
Para: La lista de python en castellano
Asunto: Re: [Python-es] Python 3.5.2
 
No, no es una excepción.
 
En matemáticas, la exponenciación tiene prioridad:
 
  -x^2 = -(x^2)
 
Los lenguajes de programación que implementan este operador, suelen adherirse a la regla (Python, PHP, D, Ruby, ...). Luego tienes disidentes como JavaScript, pero bueno...
 
Así que no, Python no es "una excepción a las reglas algebraicas".
 
Saludos,
Ricardo
 
2016-12-23 5:31 GMT-10:00 Johnny Alonso < <mailto:johnny.alonso.quintero en gmail.com> johnny.alonso.quintero en gmail.com>:
Gracias Kiko, me queda claro, es excepción a las reglas algebraicas en Python.
 
De: Python-es [mailto: <mailto:python-es-bounces%2Bjohnny.alonso.quintero> python-es-bounces+johnny.alonso.quintero= <mailto:gmail.com en python.org> gmail.com en python.org] En nombre de Kiko
Enviado el: viernes, 23 de diciembre de 2016 10:08 a. m.
Para: La lista de python en castellano
Asunto: Re: [Python-es] Python 3.5.2
 
 
 
El 23 de diciembre de 2016, 16:05, Kiko < <mailto:kikocorreoso en gmail.com> kikocorreoso en gmail.com> escribió:
 
 
El 23 de diciembre de 2016, 15:06, Johnny Alonso < <mailto:johnny.alonso.quintero en gmail.com> johnny.alonso.quintero en gmail.com> escribió:
Hola todos, estoy iniciándome en Python y creo que se presenta un fallo de precedencia con el operador menos unario:
>>> -2**2  # probable error
-4
>>> -2 * -2  # Ok
4
>>> pow(-2, 2)  # Ok
4
>>> 
Por favor, si alguien sabe si esto está documentado podría indicarme en donde lo encuentro, de lo contrario, podrían reportarlo a la fundación, yo no lo se hacer.
 
 
Se evalúa antes el operador potencia:  <https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations> https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations
Antes he ido muy rápido:  <https://docs.python.org/3/reference/expressions.html#the-power-operator> https://docs.python.org/3/reference/expressions.html#the-power-operator
 
 
 
Saludos, JohnnyAlonso

_______________________________________________
Python-es mailing list
 <mailto:Python-es en python.org> Python-es en python.org
 <https://mail.python.org/mailman/listinfo/python-es> https://mail.python.org/mailman/listinfo/python-es
 
 

_______________________________________________
Python-es mailing list
 <mailto:Python-es en python.org> Python-es en python.org
 <https://mail.python.org/mailman/listinfo/python-es> https://mail.python.org/mailman/listinfo/python-es
 



_______________________________________________
Python-es mailing list
 <mailto:Python-es en python.org> Python-es en python.org
 <https://mail.python.org/mailman/listinfo/python-es> https://mail.python.org/mailman/listinfo/python-es
 

_______________________________________________
Python-es mailing list
 <mailto:Python-es en python.org> Python-es en python.org
 <https://mail.python.org/mailman/listinfo/python-es> https://mail.python.org/mailman/listinfo/python-es
 
 

_______________________________________________
Python-es mailing list
 <mailto:Python-es en python.org> Python-es en python.org
 <https://mail.python.org/mailman/listinfo/python-es> https://mail.python.org/mailman/listinfo/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20161225/510df2e3/attachment.html>


Más información sobre la lista de distribución Python-es