2009-11-16 11 views

Odpowiedz

56

Użyj tabeli odnośników:

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

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

Można użyć eval tak:

eval("+") 
+5

to powoduje błąd składniowy – Xinus

+2

jest również bardzo niebezpieczne używać eval – Alvin

+1

Bezużyteczne "odpowiedź", która po prostu powoduje błąd składni, nie jest to nawet godne uwagi dla pokazania "niewłaściwy sposób to zrobić". –

2

Można spróbować użyć eval(), ale jest to niebezpieczne, jeśli słowa nie idą z wami. Else można rozważyć stworzenie słownika:

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

etc ..., a następnie wywołanie

ops['+'] (1,2)
lub dla danych wejściowych użytkownika:

if ops.haskey(userop): 
    val = ops[userop](userx,usery) 
else: 
    pass #something about wrong operator
12
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())) 
+0

W python3, daje to: '+': operator.add, AttributeError: obiekt 'str' nie ma atrybutu 'dodaj' –

+0

Problem polega na tym, że źle nazwany 'operator' Parametr koliduje z importowanym modułem operatorskim. Zgaduję, że wstawiłeś 'get_operator_fn' z' eval_binary_expr'. Zmień parametr 'operator' na coś innego, na przykład' oper' i wszystkie odniesienia do niego. Zobacz moją edycję. – PaulMcG

+0

Dla Python3, będziesz także musiał zmienić 'operator.div' na' operator.truediv' i naprawić wszystkie instrukcje drukowania. – PaulMcG

1

moim zdaniem, odpowiedź proponowany przez Amnon jest właściwy.

Jednak może być również zainteresowany tym artykule o matematycznym parser: http://effbot.org/zone/simple-top-down-parsing.htm

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać odnośnik. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/18628184) – xgord

+0

To należy do sekcji komentarzy, ponieważ nie jest bezpośrednią odpowiedzią. – Pablo

0

Jest magiczny sposób odpowiadający każdym operatorem

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

def apply_operator(a, op, b): 

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

apply_operator(1, '+', 2) 
+1

to działa dobrze, dzięki za udostępnianie. do sprawdzania poprawności możemy rozszerzyć apply_operator. jeśli PO == '/' i B == 0: \t powrotu np.inf jeśli PO == '/' i == 0: \t powrotu 0 – iratzhash

+0

nie pozwolić [NotImplemented] (https: //docs.python.org/3/library/constants.html#NotImplemented) działa poprawnie. – wim