Espero le sirva a alguien. Saludos
Código
#Programado por Mini_Nauta, protohey.blogspot.com #Version 1.0 #Este software esta licenciado bajo GNU V3 #http://www.gnu.org/licenses/gpl-3.0.html #El propósito de este software es aprender y deglosar el software #Modulos --------------------------------- import os #Funciones --------------------------------- def trozar_lista(lista, operador): """Didive la lista a partir del operador ya sea +, -, /, * para procesar los valores. Retorna una tupla con los valores de tipo matematico en ambos lados de la expresion. trozar_lista(list lista, str operador): return tuple(a, b)""" #se dividen la lista de 2 trozos marcando como centro el operador #el if corresponde a un parchepara cuando se ingresan 2 signos - #este funciona mientras existan mas de 2 signos -, entonces al cortar #con index el primer signo - que corresponde a un signo negativo y no de resta #se corta el string a partir del segundo signo - que corresponde a la resta if lista.count('-') > 1: trozo_izquierda = ''.join( lista[0 : buscar(lista, 2, operador)] ) else: trozo_izquierda = ''.join( lista[0 : lista.index(operador)] ) trozo_derecha = ''.join( lista[(lista.index(operador) + 1) : len(lista)] ) #tratado de numeros negativos if '-' in trozo_izquierda: #eliminacion de signo - trozo_izquierda = float( trozo_izquierda[1:len(trozo_izquierda)] ) #conversion a negativo trozo_izquierda = trozo_izquierda * -1 if '-' in trozo_derecha: #eliminacion de signo - trozo_derecha = float( trozo_derecha[1:len(trozo_derecha)] ) #conversion a negativo trozo_derecha = trozo_derecha * -1 #conversion a float si fuera necesario if type(trozo_izquierda) != float: trozo_izquierda = float(trozo_izquierda) if type(trozo_derecha) != float: trozo_derecha = float(trozo_derecha) #conversion a entero si fuese necesario if (trozo_izquierda - int(trozo_izquierda)) == 0: trozo_izquierda = int(trozo_izquierda) if (trozo_derecha - int(trozo_derecha)) == 0: trozo_derecha = int(trozo_derecha) #retorno de los 2 trozos de la lista return (trozo_izquierda, trozo_derecha) def sumar(lista): """Operacion de suma.""" trozos = trozar_lista(lista, '+') print trozos[0] + trozos[1] def restar(lista): """Operacion de resta.""" trozos = trozar_lista(lista, '-') print trozos[0] - trozos[1] def dividir(lista): """Operacion de division.""" trozos = trozar_lista(lista, '/') if(trozos[1] == 0): print "Math Error!" else: print trozos[0] / trozos[1] def multiplicar(lista): """Operacion de multiplicar.""" trozos = trozar_lista(lista, '*') print trozos[0] * trozos[1] def Clear(): """Limpia la consola.""" #windows if os.name == "nt": os.system("cls") #unix elif os.name == "posix": os.system("clear") def buscar(lista, index_num, to_index): """Busca el caracter indicado en una lista""" a = 0 for i in lista: if i == to_index: a = a + 1 if a == index_num: break return a #Programa --------------------------------- #no se permiten operandos al principio while(True): #expresion a calcular expresion = raw_input() #mismo principio de las casio con el syntax error if len(expresion) == 1: if(expresion[0] == '+') or (expresion[0] == '-') or (expresion[0] == '/') or (expresion[0] == '*'): print "Syntax error!" else: #in retorna true si encuentra lo que se busca en la lista #no modificar orden de prescedencia de sentencias if-elif #ya que estan en orden de prescedencia matematica para #un correcto funcionamiento logico del programa. #division try: if '/' in expresion: dividir(expresion) #multiplicacion elif '*' in expresion: multiplicar(expresion) #suma elif '+' in expresion: sumar(expresion) #resta elif '-' in expresion: restar(expresion) #ayuda elif ''.join(expresion) == "help": Clear() print "Basic Calculator by Mini_Nauta 1.0\n" print "clear: clean the screen" print "quit: close the calculator" print "help: show the help menu" #borrar pantalla elif ''.join(expresion) == "clear": Clear() #salir elif ''.join(expresion) == "quit": break else: print "Invalid operation. You can write help for help menu!" except: print "Syntax Error!"