[Python-es] Ayuda con sintaxis de Calculadora en Python usando WXPython

Juan José Gómez Romera jjgomera en gmail.com
Vie Ene 25 00:40:14 CET 2013


Quiza si el problema lo planteas de otra manera, en vez de que python tenga
que intepretar la expresión, creando un nuevo lenguaje, a ver si me
explico, que a python le llegue la r y sea el que sepa que lo que se quiere
es una raiz cuadrada. Algo parecido a lo que se planteo en este concurso de
programación: https://contest.tuenti.net/Questions?id=10

Yo lo solucione así:
https://github.com/jjgomera/tuenti-challenge-2/blob/master/10_Coding_m00re_and_m00re.py

Como ves los nombres son ridiculos, pero por lo demas si entiendes lo que
hace quiza sea así como quieres que python haga los cálculos, sin tener que
acudir a eval.
Además podrías permitir al usuario que configurara a su gusto las
operaciones, si r para raiz cuadrada no le gusta puedes hacer dialogos para
configurar los "accesos" para cada operación



El 24 de enero de 2013 16:32, manuel <manuelcortez00 en gmail.com> escribió:

> Hola Chema, muchas gracias por tu respuesta.
>
> Al respecto de la ONCE, conozco bien lo que desarrollan, y lo que funciona
> bien, es muy caro y al menos no llega a México si no es por una de sus
> filiales, que encima aumentan más lo que cuesta. Tienen un editor
> matemático, llamado Lambda, si no me equivoco, que te corre por 30 días y
> todo; es 100% cerrado, y lo peor de todo es que al igual que pasa con
> muchos lectores de pantalla, magnificadores, síntesis de voz,
> reconocimiento de habla, etc, es que como son sectores de mercado muy
> específico, la demanda es menor y el precio más alto. Claro, no hay nada en
> contra de esto, pero no puedes modificar nada de lo que ellos te den, y si
> por x o y razón vemos algo que no se contempla, para lo cual se usan estas
> TI, tendré menos posibilidades de ponerme a la par rápidamente.
>
> Pero es muy cierto que no tengo mucha idea de lo que mencionas para hacer
> la calculadora con cambios de estado, con lo que creo que continuaré
> pasando código por eval en forma de cadena, y restringiendo a este para que
> ejecute la menor cantidad de código no matemático posible.
>
> Lo que hago ahora es algo sencillo, pero no sé si esté del todo bien. El
> programa toma una cadena, por ejemplo "R25" que es la representación de la
> raíz de 25 (tuve problemas con el símbolo de raíz, creo que era debido a la
> codificación); luego, en una clase se define un diccionario que tiene como
> clave cada uno de los signos que llaman a una función que se pueden ver en
> la calculadora, en este caso la "R", y como valor la función Python a la
> que pertenecen, en este ejemplo, como cuando ejecuto eval() ya tengo
> importado todo math, sería "sqrt".
>
> Ahora bien, solo es cuestión de reemplazar y eso lo hace una función, que
> busca en una cadena si existe la clave del diccionario, y si existe, lo
> reemplaza con su valor, y le suma un paréntesis izquierdo, de este modo, la
> parte de "R25" quedaría como "sqrt(25". Siempre se le suma un paréntesis
> derecho a la cadena en la última función que se ejecuta antes que se mande
> a eval, ya que si se deja así no funcionará. Ahora, al terminar esta
> expresión, Python recibe "sqrt(25)", y puede reconocerlo.
>
> Un problema que se me planteó después, es ¿qué sucedería si alguien hace
> algo como "R25+R9"? El código que recibiría Python sería algo como
> "sqrt(25+sqrt(9)"; por lo que además de lo anterior, hice un procedimiento
> para que viera si hay signos, y si los hay, colocara un paréntesis
> izquierdo y un derecho antes y después del signo, para que la suma anterior
> se pudiera ver como "sqrt(25)+(sqrt(9))".
>
> Aún tengo mis dudas de que esto sea algo útil, ya que los paréntesis
> aunque dan el resultado esperado, creo que no es la mejor idea, pero más o
> menos esto es lo que actualmente se hace, y mi razón de escribir a la
> lista. Si esto está bien, solo falta usar scipy para darme funciones de
> cálculo estadístico, pero lo más seguro es que haya formas más inteligentes
> de hacer esto.
>
> Justamente para esto preguntaba acerca de la sintaxis, porque supongo que
> una vez terminado, sería más sencillo hacer que el parser se adapte a la
> entrada de texto, que intentar moldear la cadena para que Python la
> reconozca, pero no tengo mucha luz al respecto. Gracias, y saludos.
> El 24/01/13 17:16, Chema Cortes escribió:
>
>  El día 23 de enero de 2013 18:34, manuel <manuelcortez00 en gmail.com>
>> escribió:
>>
>>  Otra de las cosas que quisiera preguntar, es si se podría conseguir un
>>> resultado de un porcentaje, pero escrito de la siguiente forma: 25+50%.
>>>
>>> En GCalctool, esto se hace, pero no sé leer el código; no entiendo de muy
>>> buena forma cómo lo hacen; se asume que el 50% debe ser del número 25,
>>> pero
>>> cuando haces 25% se obtiene un 0.25, donde se asume no sé qué, se
>>> multiplica
>>> 25*1/100, y se obtiene el resultado.
>>>
>> Hay un modo sencillo de hacer la calculadora que es dar los resultados
>> parciales a medida que se van aplicando los operadores. Por ejemplo,
>> cuando sumas números, cada vez que se pulsa la tecla + se obtiene cada
>> resultado parcial de la suma.
>>
>> Tal como lo planteas, tu idea es algo más complicada. Lo simple sería
>> escribir la operación como si fuera una expresión python y dejar que
>> la evalúe el intérprete. Si lo quieres hacer de otro modo, tendrás que
>> empezar por distinguir qué operadores son totalizadores (cálculos
>> parciales y totales) y en qué posición actúan (prefix/infix/sufix).
>> Tal como creo que intuyes, no es nada fácil y necesitarás conocer algo
>> de "teoría de máquinas de estados finitos" para entenderlo, algo que
>> se sale bastante de un proyecto de final de curso.
>>
>> No tengo una recomendación clara que te pueda ayudar. Si sientes
>> curiosidad, tal vez podría buscarte algo de código para hacer una
>> calculadora.
>>
>>
>> Sobre lo que preguntas del tanto por ciento, se suelen representan los
>> números reales del 0 al 1 como factores multiplicativos, para lo que
>> se muestran multiplicados por 100 o por 1000, añadiendo el sufijo % ó
>> ‰ (unicode U+2030) respectivamente. Así, por ejemplo, el 50%
>> representa al factor 0.5, más conocido por 1/2
>>
>> En el caso de 25+50% se trataría de una operación de
>> descuentos/incrementos, donde a 25 le sumas un 50% (de 25). El porqué
>> el operador % funciona ahora así en lugar de limitarse a convertir 50%
>> en 0.5 se debe a que la calculadora ha cambiado de estado al iniciarse
>> la suma. En una suma, el 50% se toma como operación de incremento en
>> lugar de factor multiplicativo. Es un ejemplo de funcionamiento de
>> máquina de estados finitos.
>>
>>
>> Por otra parte, no sé si conoces la Fundación ONCE española. Se dedica
>> a adaptar dispositivos y aplicaciones a usuarios con deficiencia
>> visual o motora (tiflotecnología) a través de su centro CIDAT
>> (http://cidat.once.es). Mira en su FTP.
>>
>> Así mismo, existe una calculadora llamada ATCalc que se adapta a tus
>> necesidades. Es programable (en pascal), lo que te puede dar ideas
>> para tu calculadora:
>>
>> http://atcalc.sourceforge.net/**indexESP.htm<http://atcalc.sourceforge.net/indexESP.htm>
>>
>>
>>
>>
>>
>
>
> ______________________________**_________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/**mailman/listinfo/python-es<http://mail.python.org/mailman/listinfo/python-es>
> FAQ: http://python-es-faq.wikidot.**com/<http://python-es-faq.wikidot.com/>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20130125/688d9767/attachment.html>


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