Convertir la cuerda en operador

¿Cómo puedo convertir una cadena como “+” en el operador más? ¡Gracias!

Utilice una tabla de búsqueda:

import operator ops = { "+": operator.add, "-": operator.sub } # etc. print ops["+"](1,1) # prints 2 
 import operator def get_operator_fn(op): return { '+' : operator.add, '-' : operator.sub, '*' : operator.mul, '/' : operator.div, '%' : operator.mod, '^' : operator.xor, }[op] def eval_binary_expr(op1, oper, op2): op1,op2 = int(op1), int(op2) return get_operator_fn(oper)(op1, op2) print eval_binary_expr(*("1 + 3".split())) print eval_binary_expr(*("1 * 3".split())) print eval_binary_expr(*("1 % 3".split())) print eval_binary_expr(*("1 ^ 3".split())) 

Puedes intentar usar eval (), pero es peligroso si las cadenas no vienen de ti. Si no, puedes considerar crear un diccionario:

 ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: xy)} 

etc … y luego llamando

 ops['+'] (1,2) 

o, para la entrada del usuario:

 if ops.haskey(userop): val = ops[userop](userx,usery) else: pass #something about wrong operator 

Hay un método mágico correspondiente a cada operador.

 OPERATORS = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div'} def apply_operator(a, op, b): method = '__%s__' % OPERATORS[op] return getattr(b, method)(a) apply_operator(1, '+', 2) 

En mi opinión, la respuesta propuesta por Amnon es la correcta.

Sin embargo, este artículo también puede interesarle sobre un analizador matemático: http://effbot.org/zone/simple-top-down-parsing.htm

Entiendo que usted quiere hacer algo como: 5 “+” 7 donde las 3 cosas serían pasadas por variables, así que ejemplo:

 import operator #define operators you wanna use allowed_operators={ "+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.truediv} #sample variables a=5 b=7 string_operator="+" #sample calculation => a+b result=allowed_operators[string_operator](a,b) print(result) 

Tuve el problema con el mismo problema: con Jupyter Notebook no pude importar el módulo del operador. Así que el código anterior me ayudó a comprender, pero no pudo ejecutarse en la plataforma. Descubrí una forma bastante primitiva de hacerlo con todas las funciones básicas y aquí está: (Esto podría ser muy refinado, pero es un comienzo …)

 # Define Calculator and fill with input variables # This example "will not" run if aplha character is use for num1/num2 def calculate_me(): num1 = input("1st number: ") oper = input("* OR / OR + OR - : ") num2 = input("2nd number: ") add2 = int(num1) + int(num2) mult2 = int(num1) * int(num2) divd2 = int(num1) / int(num2) sub2 = int(num1) - int(num2) # Comparare operator strings # If input is correct, evaluate operand variables based on operator if num1.isdigit() and num2.isdigit(): if oper is not "*" or "/" or "+" or "-": print("No strings or ints for the operator") else: pass if oper is "*": print(mult2) elif oper is "/": print(divd2) elif oper is "+": print(add2) elif oper is "-": print(sub2) else: return print("Try again") # Call the function calculate_me() print() calculate_me() print() 

Puedes usar eval como asi:

 eval("+")