Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Operaciones Matematicas
#1
Hola, buenas tardes queria pedir ayuda para solucionar un problema. 
Estoy desarrollando un programa en python3 en el que me conecto a un servidor y este me va mandando operaciones matematicas y tengo que resolver y mandar el resultado con el inconveniente de que no puedo usar la funcion eval()

las funciones que me envian son de este tipo:
((((81 -29)* 98) + 62)* ((78- 55)+ 49))
((33/ 57) 
((61 /69)+89)) -8)

¿Alguna idea de como hacerlo?
un saludo
Responder
#2
Hola. No parece ser una tarea muy sencilla, en este enlace tienes unas cuantas soluciones para analizar y ejecutar operaciones matemáticas en una cadena. Definitivamente eval() no es una opción ya que introduce un riesgo de seguridad bastante importante.

Te extraigo uno de los códigos propuestos en el link anterior que utiliza únicamente la librería estándar.

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import ast
  5. import operator as op
  6.  
  7. # supported operators
  8. operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
  9.             ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
  10.             ast.USub: op.neg}
  11.  
  12. def eval_expr(expr):
  13.    """
  14.    >>> eval_expr('2^6')
  15.    4
  16.    >>> eval_expr('2**6')
  17.    64
  18.    >>> eval_expr('1 + 2*3**(4^5) / (6 + -7)')
  19.    -5.0
  20.    """
  21.    return eval_(ast.parse(expr, mode='eval').body)
  22.  
  23. def eval_(node):
  24.    if isinstance(node, ast.Num): # <number>
  25.        return node.n
  26.    elif isinstance(node, ast.BinOp): # <left> <operator> <right>
  27.        return operators[type(node.op)](eval_(node.left), eval_(node.right))
  28.    elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
  29.        return operators[type(node.op)](eval_(node.operand))
  30.    else:
  31.        raise TypeError(node)
  32.  
  33.  
  34. print(eval_expr("((((81 -29)* 98) + 62)* ((78- 55)+ 49))"))


Espero que te sirva.

Saludos.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)