如何在python中为属性赋一个数学表达式?

时间:2015-10-08 18:03:23

标签: python-2.7 constructor functional-programming

我想为python中的属性分配一个数学表达式(或函数)。但到目前为止我只知道如何分配像Int,Double或Boolean这样的硬参数。在代码中,下面是我想要的某种相似性。

class MyClass:

def __init__(self, mathExp):

    self.Expression=mathExp

def evalExp(self,param)
    return self.Expression(param)

我想要的是mathExp类似于“1 + 2x”,当我执行函数evalExp时,我可以输入一个像5这样的参数,这样返回就像1 + 2 * 5 = 11。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要将输入(字符串)解析为可以由python处理的内容。也就是说,如果您没有导入可以为您执行此类操作的库,例如sympy

如果你想自己做,你需要用简单的表达式来构建你的数学语言,这样在解析你的示例输入之后,你可以有一个list / tree / ...像:

[1, add, [ 2, mul, 'x']]

然后可以逐步评估。可以说,这不是最容易承担的任务。

真正的解决方案

如果您使用反向抛光表示法,即从“1 + 2x”更改为“1 2 x * +”,这会更容易一些,因为令牌列表可能如下所示:

[1, 2, x, mul, add]

然后你可以在读取令牌时进行计算:

  • 1 - 将号码推入堆栈
  • 2 - 将另一个数字推入堆栈
  • x - 获取输入,并将其推送到堆栈
  • mul - 从堆栈中获取两个数字,乘以并向后推回堆栈。即对于x=5,将2*5=10推回堆栈
  • add - 从堆栈中获取两个数字,即1, 10,然后添加它们,重新叠加堆栈

现在输入标记列表为空,堆栈有一个值11。准备下一次计算。

虚假和不安全的解决方案

但是,如果你放弃安全和安全问题,你可以走这条路:

expression = "1 + 2*x"      # The '*' needs explicitly to be there
x = 5
result = eval(expression)
print result                # Will output '11'

换句话说,然后搜索字母/单词的存在,并在将整个表达式发送到raw_input之前请求eval设置这些字母/单词。但是,使用eval会导致很多陷阱,因为它可以评估所有代码。