首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个函数,将给定的方程作为字符串并计算它。

创建一个函数,将给定的方程作为字符串并计算它。
EN

Stack Overflow用户
提问于 2014-09-30 21:03:32
回答 2查看 771关注 0票数 1

作为赋值的一部分,我正在创建一个接受字符串的函数,这是一个等式。下面是一个例子: 48+6x6/3=6x8-9x2。计算函数取等号的一边,并计算它。我不太关心分裂方程。我相信我可以和s[:s.find("=")]分享一下。

我的主要问题是计算函数本身。到目前为止,我会把它放在我现在的位置上。注释掉的部分是我试图处理的两位数的东西,但我想不出一种合乎逻辑的方法。我想让你帮我想想这个问题。

我被告知不要使用eval,因为在一个方程"2+3*5-11/2*88+153“上执行并不容易,因为运算符的优先级--或者没有它们。我的程序不应该遵守正常的运算符优先规则。相反,它应该完全从左到右进行计算。

代码语言:javascript
运行
复制
 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) 

编辑此作品为个位数。也许我们可以用多位数来处理这个问题

代码语言:javascript
运行
复制
 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)
EN

回答 2

Stack Overflow用户

发布于 2014-09-30 21:36:34

如果您接受要从不受信任的输入计算的字符串,那么使用eval 可能是非常危险的。例如,假设要计算的字符串是"os.system('rm -rf /')"?它将真正开始删除计算机上的所有文件。

因此,您可以使用python的内部编译器解析它:

代码语言:javascript
运行
复制
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))))))]))
>>>

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

票数 3
EN

Stack Overflow用户

发布于 2014-09-30 21:50:46

你可以用波兰符号。符号表示法 --这是一种基于堆栈的数据解析和评估算法。它是相当简单和广泛的应用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26130075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档