Python3-用Python编写计算器的3种方法

Python3-用Python编写计算器的3种方法

用python实现简单的计算器功能,有很多思路,这里介绍三种方法,并分析各自的优缺点。下图是一个真是的计算器,由StellrWeb摄于Unsplash

众所周知,根据Tao of Python的规定,对于任何给定任务:

应该有一种明显的方法,最好只有一种

但是,在编写简单的计算器程序的情况下,有许多不同的方法可以执行此操作。哪一个是“最佳”,很大程度上取决于上下文。

在本文中,我将讨论三种常见的方法,包括每种方法的优点和缺点。

方案1:条件分支法

如果只有一种“明显”的方式在Python中构建计算器,那就是使用条件分支。

基本步骤是:

  1. 要求用户输入
  2. 根据选择的操作员有条件地选择一项操作
  3. 使用选定的运算符执行计算
  4. 打印结果

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
num1 = input("First Number:\n")
operator = input("Operator (+, -, *, /):\n")
num2 = input("Second Number:\n")

num1 = float(num1)
num2 = float(num2)

out = None

if operator == "+":
    out =  num1 + num2
elif operator == "-":
    out = num1 - num2
elif operator == "*":
    out = num1 * num2
elif operator == "/":
    out = num1 / num2
    
print("Answer: " + str(out))

执行该程序,控制台输出:

1
2
3
4
5
6
7
8
First Number:
1
Operator (+, -, *, /):
+
Second Number:
2
Answer: 3.0

这种方法缺点是:

  • 仅支持二元操作
  • 一个简单的任务有很多代码

方案2:eval()

另一种方法是使用Python的内置eval()函数。 eval允许将任何字符串评估为Python表达式。这是个非常强大的功能,因为它允许在运行时动态生成和执行代码。

使用此代码,可以将以上代码简化为:

1
2
3
calc = input("Type calculation:n")  
      
print("Answer: " + str(eval(calc)))

与解决方案1相比,eval()有一些优点:

  • 它可以接受任意表达式(例如1 + 2-3 * 4`),而不仅限于二元操作
  • 代码少

如果仅在自己的计算机上本地使用”eval”,它可能是“一种明显的方式”,因为它非常方便且功能强大。但是,在生产环境中应格外小心。原因是eval可以执行任意python表达式,因此可以用于恶意目的。

可以在此处上找到有关”eval”的安全风险的好文章。

方案3:字典查找和递归

在此版本的Python计算器中,与解决方案1相比,我们将进行以下增强:

  • 字典查找用于排除条件分支。这使代码更清洁,更具可读性和可扩展性
  • 使用Python的operator模块来代替定义我们自己的数学函数
  • 递归用于支持复杂的数学表达式(不仅仅是二进制运算)

结果代码如下:

这种方法比解决方案1更强大,并且比解决方案2更安全。

它的工作方式是,当用户传入一个字符串(例如1 + 2*3)时,我们的calculate()函数遍历我们在operators词典中定义的每个运算符,并调用字符串partition方法首次出现在该运算符上。对于”1 + 2 * 3”,这将给我们:

1
2
3
left = '1'  
operator = '+'  
right = '2*3'

calculate()是然后在子表达式上递归调用,直到它s.isdigit()返回true为止。因此,在上面的示例中,我们的递归调用将如下所示:

1
return operators['+'](calculate('1'), calculate('2*3'))

解析为:

1
return add(1, 6)

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from operator import pow, truediv, mul, add, sub  

operators = {
  '+': add,
  '-': sub,
  '*': mul,
  '/': truediv
}

def calculate(s):
    if s.isdigit():
        return float(s)
    for c in operators.keys():
        left, operator, right = s.partition(c)
        if operator in operators:
            return operators[operator](calculate(left), calculate(right))

calc = input("Type calculation:\n")
print("Answer: " + str(calculate(calc)))

运行该程序,控制台输出 :

1
2
3
Type calculation:
1+2*3-5
Answer: 2.0

终极方案方案:使用e模块!

终极方法是使用e模块。这样,我们可以从命令行打开Python解释器“直接”计算Python表达式。

安装:

1
pip install e

然后使用一行命令即可计算任意表达式:

1
2
3
4
$ python -me 1 + 1  
2
$ python -me "10 * 5 - (6**2) + 6 / 3"  
16

十分简单易用!

Rating: