创建一个函数,该函数将一个等式作为字符串给出并计算它

时间:2014-09-30 21:03:32

标签: python parsing equation slice

作为作业的一部分,我正在创建一个接受字符串的函数,这是一个等式。这是一个例子:48 + 6x6 / 3 = 6x8-9x2。 compute函数取等号的一边并对其进行求值。我不太关心分裂方程式。我相信我可以用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)

2 个答案:

答案 0 :(得分:3)

如果您接受要从不受信任的输入进行评估的字符串,则使用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编写,不需要任何外部库。

答案 1 :(得分:0)

您可以使用波兰表示法。 http://en.wikipedia.org/wiki/Polish_notation 这是一种基于堆栈的算法,用于解析和评估数据。它非常简单并且被广泛使用。

相关问题