python - 创建一个函数,该函数接受以字符串形式给出的方程并计算它

标签 python parsing equation slice

作为作业的一部分,我正在创建一个接受字符串(即方程)的函数。这是一个例子:48+6x6/3=6x8-9x2。计算函数取等号的一侧并对其进行计算。我不太关心分解方程。我相信我可以用s[:s.find("=")]来切片它.

我的主要问题是计算函数本身。我将发布到目前为止我的情况。注释掉的部分是我试图处理两位数的内容,但我无法找出一个合乎逻辑的方法来做到这一点。我需要一些帮助来思考这个问题。

有人告诉我不要使用 eval,因为由于运算符优先级或缺乏,对方程“2+3*5-11/2*88+153”进行 eval 并不容易其中。我的程序不应该遵守正常的运算符优先级规则。相反,它应该纯粹从左到右进行评估。

 def compute(s):
    result = 0
    a = 1
    for a in range(len(s)):

    #while s[a].isdigit():
        #result = (result * 10) + int(s[a])
        #a += 1

    if s[a] == '/':

        result = result / int(s[a + 1])

    elif s[a] == '+':

        result = result + int(s[a + 1])

    elif s[a] == 'x' or s[a] == '*' or s[a] == 'X':

        result = result * int(s[a + 1])
    elif s[a] == '-':
        result = result - int(s[a + 1])
    else:
        result += int(s[a])
    a += 1
    return result

 print(compute("48+6x6/3") == 108) 

编辑这适用于单位数字。也许我们可以让它处理多个数字

 def compute(s):
    result = int(s[0])
    op = 0
    a = 1
    while a < len(s):
        if s[a] == '/':
        result /= int(s[a + 1])
    elif s[a] == '+':
        result += int(s[a + 1])
    elif s[a] == '*':
        result *= int(s[a + 1])
    elif s[a] == '-':
        result -= int(s[a + 1])
    a += 1
    return int(result)

最佳答案

如果您接受来自不受信任的输入的字符串进行评估,则使用eval可能非常危险。例如假设正在评估的字符串是 "os.system('rm -rf/')" ?它实际上会开始删除计算机上的所有文件。

所以可以用python内部的compiler来解析它:

import compiler
eq="48+6*6/3"
ast= compiler.parse( eq )

>>> compiler.parse( eq )
Module(None, Stmt([Discard(Add((Const(48), Div((Mul((Const(6), Const(6))), Const(3))))))]))
>>>

您也可以使用sympy这是一个用于符号数学的 Python 库。它的目标是成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便易于理解和扩展。 SymPy 完全用 Python 编写,不需要任何外部库。

关于python - 创建一个函数,该函数接受以字符串形式给出的方程并计算它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130075/

相关文章:

c# - 如何将字符串 c# 方程转换为答案

python - 在 Dash Tables Python 中调整表格的 MaxHeight

javascript - 如何循环 JSON post 响应并将其数据打印到图像 div 中?

c++ - C++ 中的日期/时间解析

javascript - JSON.parse 给出了一个 "undefined"对象

c++ - 二次方程程序输出数字

java - GUI 随机方程生成器

python - 分析python中libsvm的预测模型

python:获取不带小数位的数字

javascript - XHR 无法加载 <URL>。请求的资源上不存在 'Access-Control-Allow-Origin' header