"+" 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
"+" 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
bir arama tablosu kullanın:
Ö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
Sen eval() kullanarak deneyebilirsiniz, ancak dizeleri senden geliyor değilse çok tehlikeli:
eval("+")
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()))
çalışır eğer deneyin, bu verir: '+': operator.add, AttributeError: 'str' nesne hiçbir özelliği sorunudur –
'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
Python3 için, ayrıca 'operator.div' işlevini 'operator.truediv' olarak değiştirmeli ve tüm baskı ifadelerini düzeltmelisiniz. – PaulMcG
, cevap Amnon önerdiği doğru olanıdır. http://effbot.org/zone/simple-top-down-parsing.htm
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
Bu, doğrudan bir cevap olmadığı için yorum bölümüne ait. – Pablo
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)
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
(http: //docs.python.org/3/library/constants.html#NotImplemented) düzgün çalışıyor. – wim
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