fork(4) download
  1. # Calculadora prefija
  2. # + 1 3 -> 4
  3.  
  4.  
  5. def calcula(opr, op1, op2):
  6. """Calcula una expresión inmediata, como + 2 4"""
  7. toret = 0
  8.  
  9. if opr == '+':
  10. toret = op1 + op2
  11. elif opr == '-':
  12. toret = op1 - op2
  13. elif opr == '*':
  14. toret = op1 * op2
  15. elif opr == '/':
  16. toret = op1 / op2
  17. elif opr == '^':
  18. toret = op1 ** op2
  19. else:
  20. raise Exception("operando no reconocido")
  21.  
  22. return toret
  23.  
  24.  
  25. def parse(s):
  26. """Retorna los operadores y operandos, como una lista de texto."""
  27.  
  28.  
  29. def inserta_operando():
  30. nonlocal operando
  31.  
  32. toret.append(float(operando))
  33. operando = ""
  34.  
  35. operando = ""
  36. toret = []
  37. operadores = "+-*/^"
  38. pos = 0
  39.  
  40. for ch in s:
  41. if ch in operadores:
  42. if operando:
  43. inserta_operando()
  44. toret.append(ch)
  45. elif ch.isdigit() or ch =='.':
  46. operando += ch
  47. else:
  48. inserta_operando()
  49.  
  50. if operando:
  51. inserta_operando()
  52.  
  53. return toret
  54.  
  55.  
  56. def opera(eltos, pos):
  57. """Función recursiva que calcula una expresión compleja"""
  58.  
  59. opr = ""
  60. op1 = 0.0
  61. op2 = 0.0
  62.  
  63. # Leer el operador
  64. elto = eltos[pos]
  65. if isinstance(elto, str):
  66. opr = elto
  67. else:
  68. raise Exception("se esperaba un operador")
  69.  
  70. # Leer el operando 1
  71. pos += 1
  72. elto = eltos[pos]
  73. if isinstance(elto, str):
  74. # Es un operador
  75. pos, op1 = opera(eltos, pos)
  76. else:
  77. op1 = elto
  78.  
  79. # Leer el operando 2
  80. pos += 1
  81. elto = eltos[pos]
  82. if isinstance(elto, str):
  83. # Es un operador
  84. pos, op2 = opera(eltos, pos)
  85. else:
  86. op2 = elto
  87.  
  88. return pos, calcula(opr, op1, op2)
  89.  
  90.  
  91. if __name__ == "__main__":
  92. s = input("Dame una expresión prefija: ")
  93. print("\nResultado:", opera(parse(s), 0)[1])
  94.  
Success #stdin #stdout 0.02s 9312KB
stdin
*+1 3.2/8 /12.0 6
stdout
Dame una expresión prefija: 
Resultado: 16.8