簡體   English   中英

Python:在不使用 eval() 函數的情況下評估表達式

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

我期待制作一個計算器來計算輸入,例如 2*((25+2)/2)*(3**5) 使用 python,而不使用 eval 函數。 有什么辦法嗎?

您可以標記化然后使用堆棧評估中綴表達式。 這是我會怎么做

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