【问题标题】:This python code is not solving equations此 python 代码不解决方程
【发布时间】:2017-02-15 22:56:04
【问题描述】:

我有一个即时通讯程序的聊天机器人,我正在尝试为它制作一个数学求解器,但它无法将方程的解发送到即时通讯程序,而是发送方程。

如果即时通讯程序中的某人发送“解决:2+2”,则此程序应发送“4”而不是“2+2”。

主要问题:

if (parser.getPayload().lower()[:6]=="solve:"):
                    parser.sendGroupMessage(parser.getTargetID(), str(parser.getPayload()[7:]))

输出:

it's sending same input again not the answer of equation

测试: 我测试了一些东西,它工作正常。如果我添加此代码,程序将发送方程的解:

if (parser.getPayload().lower()=="test"):
                    parser.sendGroupMessage(parser.getTargetID(), str(2 + 2 -3 + 8 * 7))

输出: Working perfectly

【问题讨论】:

  • 尝试在 python 中使用eval 语句。 eval("2+2") 会给你4
  • @PrestonHager eval强烈反对ast.literal_eval 更好
  • 是的,ast 模块看起来不错。请改用ast.literal_eval("2+2")。不要忘记导入 ast,import ast
  • 嗯,先生们,您正在教他如何评估他从聊天中获得的随机代码? @Bharat,请注意人们会向您发送任何内容,即他们将保存解决方案而不是 2+2
  • 解决了。感谢@PrestonHager、Andrew L. 和 MK。

标签: python bots irc instant-messaging payload


【解决方案1】:

以字符串形式评估数学表达式需要做什么。

但是,如果您只是 eval 他们给您的任何东西,那么用户输入是危险的。 Security of Python's eval() on untrusted strings?

您可以使用ast.literal_eval 来降低风险。

或者您可以使用以下问题的答案中的评估器 Evaluating a mathematical expression in a string

【讨论】:

    【解决方案2】:

    你的测试代码

    str(2 + 2 -3 + 8 * 7)
    

    与您的生产代码不同

    str(parser.getPayload()[7:])
    

    展开成

    str("2 + 2 -3 + 8 * 7")
    

    假设您传递了相同的引用。好消息是你的管道工作正常了,现在你需要实现真正的数学求解器,比如

    str(solve_math(parser.getPayload()[7:]))
    
    def solve_math(expr : str) -> float:
        """
        Parses and evaluates math expression `expr` and returns its result.
        """
    

    这里你需要首先将表达式字符串解析成某种结构,代表数据、运算符/函数和评估顺序。所以你的“2 + 2”表达式变成了类似Addition(Const(2), Const(2))的东西,而表达式“2 + 2 * 3”变成了类似Addition(Const(2), Multiplication(Const(2), Const(3)))的东西,然后你只需要评估它应该相当简单。

    我推荐pyparsing 来帮助你。

    【讨论】:

    • 感谢您解释一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多