80 votes

Transformez la chaîne en opérateur

Comment puis-je transformer une chaîne de caractères telle que "+" dans l'opérateur plus ?

131voto

Amnon Points 4864

Utilisez une table de consultation :

import operator
ops = { "+": operator.add, "-": operator.sub } # etc.

print(ops["+"](1,1)) # prints 2

35voto

Paul McGuire Points 24790
import operator

ops = {
    '+' : operator.add,
    '-' : operator.sub,
    '*' : operator.mul,
    '/' : operator.truediv,  # use operator.div for Python 2
    '%' : operator.mod,
    '^' : operator.xor,
}

def eval_binary_expr(op1, oper, op2):
    op1, op2 = int(op1), int(op2)
    return ops[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())))

11voto

Vous pouvez essayer d'utiliser eval(), mais c'est dangereux si les chaînes de caractères ne proviennent pas de vous. Sinon, vous pouvez envisager de créer un dictionnaire :

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

etc... et ensuite appeler

ops['+'] (1,2)

ou, pour l'entrée de l'utilisateur :

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

9voto

Garrett Points 91

Que diriez-vous d'utiliser un dictateur de recherche, mais avec des lambdas au lieu de la bibliothèque d'opérateurs.

op = {'+': lambda x, y: x + y,
      '-': lambda x, y: x - y}

Alors vous pouvez le faire :

print(op['+'](1,2))

Et ça va sortir :

3

5voto

Il existe une méthode magique correspondant à chaque opérateur

OPERATORS = {'+': 'add', '-': 'sub', '*': 'mul', '/': 'div'}

def apply_operator(a, op, b):

    method = '__%s__' % OPERATORS[op]
    return getattr(b, method)(a)

apply_operator(1, '+', 2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X