使用python实现一个简单计算器

  介绍

本篇文章为大家展示了使用python实现一个简单计算器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、功能目标

用户输入一个类似,1 - 2 *((60-30 +(-40/5)*(以* 5/3 + 7/3 * 99/4 * 2998 + 10 * 568/14))-(4 * 3)/(16-3 * 2)),这样的表达式,假设表达式里面除了包含空格,& # 39;+ & # 39;& # 39;& # 39;& # 39;* & # 39;& # 39;/& # 39;和括号再无其他特殊符号,然后自己动手写代码解析其中的表达式,实现加减乘除<强>、最后得出的结果与真实的计算机所算的结果必须一致。

二、解题思路

1,为了分开运算符和数字,因此把输入的字符串格式转换为列表的格式进行处理,这样子就可以按位进行处理了

2,实现功能的核心点在于括号,乘,除加减的优先级排序,因此我们先想办法一层一层的去括号,即从最里层的括号开始计算,然后去掉第一层括号,然后一直继续这个过程,最后得到一个没有括号的列的表,再进行计算得出结果

3,去括号方式:最内层的括号内的表达式就可以当做一个无括号表达式,通过先运算出乘除,再运算出加减得出整个括号内的值,用这个结果值整体替换括号内的内容即实现了去一层括号,然后通过递归去除所有的括号

4,去除乘除号方式:见remove_multiplication_division (eq)函数部分

5,去除加减号方式:见remove_plus_minus (eq)函数部分

三、函数说明

<强> 1,主函数

 def计算器(eq):
  format_list=eq_format (eq) #把字符串变成格式化列表形式
  s_eq=简化(format_list) #去括号,得到无括号的一个格式化列表
  ans=计算(s_eq) #计算最终结果
  如果len (ans)==2: #判断最终结果为正数还是负数
  ans=?ans [1])
  其他:
  ans=浮动(ans [0])
  返回ans 

<强> 2,eq_format()函数

 def eq_format (eq):
  & # 39;& # 39;& # 39;
  :param情商:输入的算式字符串
  返回:格式化以后的列表,如[& # 39;60 & # 39;& # 39;+ & # 39;,& # 39;7 & # 39;,& # 39;* & # 39;,& # 39;8 & # 39;】
  & # 39;& # 39;& # 39;
  format_list=re.findall (& # 39; [\ d \] + | \(+ | | \ \ - | | \/| \ \ *) & # 39;,情商)
  返回format_list 

2.1这个函数的作用是把输入的算式通过再保险模块,用正则表达式把算术符号和数字分开。

2.2, (\ d \。]+ | \(* | + | | \ \ - | \ \/| \)意思:按管道符号|(|表示或的意思)可分为几部分,(\ d \。)+,是指匹配数字或小数点一次或多次,\(是指左括号,\ +是指加号,\——是指减号,\ *是指乘号,\/是指除号,\)是指右括号,整个正则表达式会把字符串变成类似[& # 39;(& # 39;& # 39;6 & # 39;,& # 39;* & # 39;,& # 39;5 & # 39;,& # 39;& # 39;& # 39;7 & # 39;,& # 39;)& # 39;]这样子的格式列表

<强> 3,简化()函数

 def简化(format_list):
  & # 39;& # 39;& # 39;
  :param format_list:输入的算式格式化列表如[& # 39;60 & # 39;& # 39;+ & # 39;,& # 39;7 & # 39;,& # 39;* & # 39;,& # 39;8 & # 39;】
  返回:通过递归去括号,返回简化后的列的表
  & # 39;& # 39;& # 39;
  
  托架=0 #用于存放左括号在格式化列表中的索引
  数=0
  因为我在format_list:
  如果我==& # 39;(& # 39;:
  托架=计数
  elif我==& # 39;)& # 39;
  temp=format_list[支架+ 1计数):
  #打印(临时)
  new_temp=计算(临时)
  format_list=format_list[:支架]+ new_temp + format_list[计数+ 1:]
  format_list=改变(format_list托架)#解决去括号后会出现的——+问题
  返回简化(format_list) #递归去括号
  数=数+ 1
  返回format_list #当递归到最后一层的时候,不再有括号,因此返回列表

3.1这个函数的作用是:把输入的带有括号的格式化列表,用递归的方式去除括号,每一次递归去一个括号,直到没有括号则返回去完括号的格式化列表

3.2找到最内层括号的方法:遍历列表,如果遇到左括号,则把当前左括号的索引赋值给参数架,直到遇到第一个右括号,此时的索引与托架中间的元素即为最内层括号的元素,用切片的方式提取出来,通过计算()函数计算出值,然后用计算结果去替换掉此时左括号到第一个右括号的元素,此时去除第一层括号,然后进入递归,不断递归直至去除所有括号

3.3可能遇到的问题:

,,,,,首先是不要用指数的方式去取当前左括号的索引,因为列表的索引方法返回的一直都是第一个左括号的索引,而不是当前左括号的索引,会导致出错。因此我在函数内用参数计数进行计数当前索引值。

使用python实现一个简单计算器