Python 将字符串方程式转换为整数答案

Python 将字符串方程式转换为整数答案,python,Python,如果我有一根绳子 equation = "1+2+3+4" 如何将其转换为int并使答案相等?我是这样想的,但会有错误 answer = (int)equation print(answer) 方程式可能包含+-*/如果您只有数字和加号,则此选项有效: answer = sum(float(i) for i in equation.split('+')) 或者如果你知道它们只会是整数 answer = sum(int(i) for i in equation.split('+')) 如果

如果我有一根绳子

equation = "1+2+3+4"
如何将其转换为int并使答案相等?我是这样想的,但会有错误

answer = (int)equation
print(answer)

方程式可能包含
+-*/

如果您只有数字和加号,则此选项有效:

answer = sum(float(i) for i in equation.split('+'))
或者如果你知道它们只会是整数

answer = sum(int(i) for i in equation.split('+'))
如果你想评估更多,我建议你做家庭作业:

  • 查找字符串模块(具有string.digits)

  • 数学模块,其中包含您的操作


  • 创建逻辑以按正确顺序执行操作


祝你好运

如果您准备接受风险,即您可能让恶意用户在您的机器上随意运行,您可以使用:


这不会使用
eval()
secure。它只是给了它一个干净、空旷的运行环境。恶意用户仍然可以用软管连接您的系统。

我建议您使用
eval
并检查输入:

def evaluate(s):
    import string
    for i in s:
        if i not in "+-*/ " + string.digits:
            return False       # input is not valid
    return eval(s)
如前所述,
eval
是不安全的,很难保证安全。我记得看到一篇很好的博客文章解释了这一点,有人知道这是什么吗?但是
ast.literal\u eval
是安全的,它不允许
\u导入\u
等。我强烈建议尽可能使用
ast.literal\u eval
而不是
eval
。不幸的是,在这种情况下,这是不可能的。但是,在另一种情况下,例如,您只需要支持加法和乘法,您可以(并且应该)使用
literal\u eval


另一方面,如果这是一项旨在让您学习语法分析的家庭作业,那么我建议您以不同的方式进行。我知道,如果我是一名教师,我会用
eval
回答“非常聪明,但这不会帮助你通过抽象语法树的测试。”(顺便说一句,如果你想“正确地”实现这一点,你应该看看这一点)。

如果我们想向全世界展示计算器,我很想看看一个破解者是否能解决这个问题:

import string

def less_dangerous_eval(equation):
    if not set(equation).intersection(string.ascii_letters + '{}[]_;\n'):
        return eval(equation)
    else:
        print("illegal character")
        return None

less_dangerous_eval('1*2/3^4+(5-6)')
返回:

3

我知道,如果给它错误的语法(可以用try/except块修复)或一个占用系统所有内存的操作(try/except捕捉这一点可能更不确定),就可以打破这种情况,但我目前还不知道有人有什么方法可以控制。对于浮点数,使用
math.fsum
而不是
sum
。从对问题的评论来看,他实际上想处理更一般的表达式“创建逻辑以正确的顺序执行操作”,说起来很容易,做起来却不那么容易!你可以试试,但是你可能需要稍微改变一下你的输入字符串。-1:他指定他需要支持乘法和除法。当我使用该代码时,我会得到格式错误的字符串错误。我做错了什么?@sweeneyrod不,他们没有。@DavidHeffernan:python3目前似乎允许
+
-
ast.literal\u eval
中。我很惊讶地发现,因为我现在不明白为什么它应该这样做。@sweeneyrod不,乘法和除法在任何python版本下都不受支持。加法和减法仅在Python3.+1中使用,尽管我更喜欢根据一小部分接受字符的白名单检查输入,而不是检查其他字符的黑名单,尽管我认为这里没有太大区别。至于它是如何被破坏的,我能得到的最接近的是
9**9**9**9**9**9**9
,或者类似的东西可能会引起
记忆错误。
import string

def less_dangerous_eval(equation):
    if not set(equation).intersection(string.ascii_letters + '{}[]_;\n'):
        return eval(equation)
    else:
        print("illegal character")
        return None

less_dangerous_eval('1*2/3^4+(5-6)')
3