我想为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。
感谢您的帮助!
答案 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
会导致很多陷阱,因为它可以评估所有代码。