2009-11-16 39 views
17

"+" gibi bir dizeyi işleve nasıl artırabilirim? Teşekkürler!Dizgiyi işleve döndürün

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

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

tekabül yöntemi dizesine başka şeyler dönüştürmek ve değerlendirebilir vardır http:

Ancak, aynı zamanda matematiksel bir ayrıştırıcı hakkında bu makalede tarafından ilginizi çekebilir : //stackoverflow.com/questions/729248/python-eval-and-globals – Xinus

cevap

56

bir arama tablosu kullanın:

-12

Öyle gibi eval kullanabilirsiniz. kullanıcı girişi için,

ops['+'] (1,2)
arayarak veya sonra

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

vs ... ve: Else Eğer bir sözlük oluşturarak dikkate alabileceğiniz Bence

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

bu, – Xinus

+2

sözdizimi hatasına neden olur, ayrıca sadece sözdizimi hatası üreten eval – Alvin

+1

Yararsız "yanıtı" kullanmak çok tehlikelidir, bu bile gösterilmek için dikkate değer değildir. "Bunu yapmak için yanlış bir yol". –

2

Sen eval() kullanarak deneyebilirsiniz, ancak dizeleri senden geliyor değilse çok tehlikeli:

eval("+") 
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

çalışır eğer deneyin, bu verir: '+': operator.add, AttributeError: 'str' nesne hiçbir özelliği sorunudur –

+0

'ekle' vardır zayıf adlı 'operator' o İthal edilen operatör modülü ile parametre çakışmaları. Tahminim, get_operator_fn'yi eval_binary_expr ile belirtmişsinizdir. Operatör parametresini "oper" gibi başka bir şeye ve ona yapılan tüm referanslara değiştirin. Düzenlememe bak. – PaulMcG

+0

Python3 için, ayrıca 'operator.div' işlevini 'operator.truediv' olarak değiştirmeli ve tüm baskı ifadelerini düzeltmelisiniz. – PaulMcG

1

, cevap Amnon önerdiği doğru olanıdır. http://effbot.org/zone/simple-top-down-parsing.htm

+0

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum yaz] (/ review/düşük kaliteli yazılar/18628184) – xgord

+0

Bu, doğrudan bir cevap olmadığı için yorum bölümüne ait. – Pablo

0

sihirli her operatör yerine

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

bu iyi çalışıyor, paylaşım için teşekkürler. doğrulama için apply_operator'ı uzatabiliriz. halinde op == '/' b == 0: np.inf \t dönüş halinde op == '/' ve == 0: \t dönüş Bu [NotImplemented] izin vermez 0 – iratzhash

+0

(http: //docs.python.org/3/library/constants.html#NotImplemented) düzgün çalışıyor. – wim