使用列表值进行计算

时间:2014-06-06 12:49:12

标签: python

我正在尝试用Python编写计算器程序。除了如何在列表中的每个命令之后“完成”计算之外,我几乎已经知道了其他一切。

如果直接写入python控制台(如在23*2+(5-2)中),是否有任何方法可以计算此列表的值。

示例:

list = ['23', '*', '2', '+' '(', '5', '-', '2', ')'] 

我想在上面的计算(23*2+(5-2))中处理它。优选地,不使用任何库。尝试从各处看,但找不到答案。我自己也不会想到一个。

4 个答案:

答案 0 :(得分:0)

一种方法是使用eval函数,如此

>>> a = ['23', '*', '2', '+' '(', '5', '-', '2', ')'] 
>>> eval(''.join(a))
49

这是有效的,因为您可以join列表形成eval可以处理的有效数学表达式。

请注意,如果您使用动态输入,这会带来风险,因为eval也可以执行可能会损害您系统的内容,例如删除文件。

答案 1 :(得分:0)

您可以使用eval功能,但this is considered bad practice。相反,考虑实现一个算法(如评论中建议的@Kevin)来解析表达式。

答案 2 :(得分:0)

我看到两种方式: 1.邪恶:使用eval功能。 2.正确:建立CalculatorTree课程。添加运算符优先级的规则。将列表的每个字符串添加到树中,让它评估表达式。

答案 3 :(得分:0)

如果你对将值推入列表并评估列表的想法已经结婚,那么有一种相当简单的方法可以做到这一点。

# Here's your list
a = ['23', '*', '2', '+' '(', '5', '-', '2', ')'] 

# Let's turn that list into a string
b=" ".join(a)

# Let's see what it looks like
print b 
>>>'23 * 2 +( 5 - 2 )'

# Let's evaluate it
c = eval(b)

# is it right?
print c
>>>49

现在有一些问题吗?这就是为什么我会说大多数计算器程序都不能以这种方式运行的原因。如果我在列表中输入一长串不能正常工作的东西怎么办?

a = ['22', '23', '+', '46']

执行上述过程将失败,因为22 23 + 46甚至意味着什么?大多数简单的计算器应用都可以验证输入。我的第一个建议是从反向抛光符号计算器开始。在这里你可以输入如下内容:

34 26 +

这可能看起来很奇怪但是从编程的角度来看它实际上有点容易(因为你可以实现没有parens的操作顺序。你也可以尝试在计算器进入时验证输入。如果用户连续输入2个数字,会发生什么?如果用户忘记了一个封闭的括号应该发生什么?在这样的应用程序中,当输入完美时给出正确答案是不够的,而不是#39;重要的是要优雅地失败,并确保轻微的错误不会让用户感到不快。

我认为考虑将整个函数保留在列表中是否值得考虑也是有价值的。如果我输入了300号码功能并且在第一个号码中出错了怎么办?如果以某种方式你最终得到几千个数字函数怎么办? (不太可能,但值得考虑作为心理锻炼。)值得保持:

(1 + 1) + (1 + 1) + (1 + 1) .......... 

当你可以评估输入数据时?