简体   繁体   English

Python:在不使用 eval() 函数的情况下评估表达式

[英]Python : Evaluate an expression without using eval() function

I'm looking forward to make a calculator to calculate an input such as 2*((25+2)/2)*(3**5) using python, without using eval function.我期待制作一个计算器来计算输入,例如 2*((25+2)/2)*(3**5) 使用 python,而不使用 eval 函数。 is there any way?有什么办法吗?

You can tokenize and then evaluate the infix expression using stack.您可以标记化然后使用堆栈评估中缀表达式。 Here is how I would do it这是我会怎么做

def tokenize(text):
    text= text.replace("**", "^")
    text = '(' + text + ')'
    token = []
    for char in text:
        if char in "0123456789":
            token.append(char)
        elif char in " +-*/()^":
            if token:
                yield int("".join(token))
                token = []
            if char != " ":
                yield char
        else:
            raise ValueError(f"unknown character {char!r}")
    if token:
        yield int("".join(token))

def evaluate_infix(tokens):
    stack = []
    for token in tokens:
        if token == ")":
            lb, lhs, op, rhs = stack[-4:]
            del stack[-4:]
            if lb != "(":
                raise ValueError("three tokens must be between parens")
            if op == '-':
                token = lhs - rhs
            elif op == '+':
                token = lhs + rhs
            elif op == '*':
                token = lhs * rhs
            elif op == '/':
                token = lhs / rhs
            elif op == '^':
                token = lhs ** rhs
        stack.append(token)
    return stack[-1]
    
exprs = # YOUR STRING GOES HERE
print(evaluate_infix(tokenize(exprs)))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM