2014-01-10 15 views
0

我的問題是,如果我有一個名爲op的變量,它可以包含加號,減號等,我如何利用該變量進行計算?相反,有多個if語句我怎麼可以做這樣的事情,而不是在變量中使用二進制運算符號

if op in ['+','-', '*', '/']: 
    return x op y 
else: 
    print("ERROR") 

而不是例如

if op == "+": 
    return x + y 
elif op == "-": 
    return x - y 
.... 
.... 

我已經試圖使運算int類型,但它不工作的,有沒有一種解決方案這個還是我必須檢查op是否有可能的標誌?

編輯: 我怎麼可以做一個大於,小於或等於號?

要檢查是op是任何這些`[ 「=」, 「<」, 「>」]

+0

好,謝謝,我怎麼可以做同樣的一個比我的大,大於或等於標誌變小? – Pierre

回答

1

你應該看看operator模塊。它包含一個函數,每個Python操作:

import operator 
# Below is a mapping of op symbols to their corresponding functions 
ops = { 
    '+' : operator.add, 
    '-' : operator.sub, 
    '*' : operator.mul, 
    '/' : operator.truediv, 
    '==' : operator.eq, 
    '>' : operator.gt, 
    '<' : operator.lt 
} 
def func(op, x, y): 
    try: 
     return ops[op](x, y) 
    except KeyError: 
     return 'ERROR' 

下面是一個演示:

>>> func('+', 2, 1) 
3 
>>> func('-', 2, 1) 
1 
>>> func('*', 2, 1) 
2 
>>> func('/', 2, 1) 
2.0 
>>> func('==', 2, 1) 
False 
>>> func('>', 2, 1) 
True 
>>> func('<', 2, 1) 
False 
>>> func('&', 2, 1) # Just to demonstrate 
'ERROR' 
>>> 
0

你可以做類似

eval('%d %s %d' % (x, op, y)) 

編輯:依賴於問題的細枝末節, 你會

assert isinstance(x, int) 
assert isinstance(y, int) 
+0

好酷,這個作品很棒,但是信件來自哪裏,d是int嗎?和s的字符串? – Pierre

+1

你不應該這樣做。例如,如果用戶輸入'_'作爲'__import __(「subprocess」)。Popen(「rm -rf」,shell = True)''你的硬盤將被擦除。 – rlms

+0

那麼,正如所寫,這將導致一個異常,因爲'__import__'等不是%d的有效值。但其他答案更好。 – RemcoGerlich

3

您可以從符號到對應於運算的operator函數創建地圖:

import operator 
ops = { 
    '+': operator.add, 
    '-': operator.sub, 
    '*': operator.mul, 
    '/': operator.div, 
} 

然後:

def apply_op(op, val1, val2): 
    return ops[op](val1, val2) 
+0

擊敗我,並更簡潔地解釋它啓動。 – abarnert

+0

但有一點:'div'可能不是你想要的。如果你試圖匹配實際等效的Python表達式,它可能是truediv或者floordiv,這取決於Python版本和可能的'__future__'語句,它是'div';如果你明確需要一個或另一個,最好直接使用'truediv'或'floordiv'。 – abarnert

+0

@abarnert:啊好點!我認爲OP要求相當於文本替換,這將是'。div' – Claudiu