Python设计实现的计算器功能完整实例


Posted in Python onAugust 18, 2017

本文实例讲述了Python设计实现的计算器功能。分享给大家供大家参考,具体如下:

通过利用PYTHON 设计处理计算器的功能如:

1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2))

我的处理计算基本思路是:

解题思路是,需要优先处理内层括号运算--外层括号运算--先乘除后加减的原则:

1、正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进行正则处理,先获取最里层的每一个数据,然后一一计算

所要用到的正则是:

inner = re.search("\([^()]*\)", calc_input)

2、把有括号的计算公式计算出来的结果替换原来初始公式的位置,计算之前分别对重复运算符进行处理

需要处理的重复运算的函数是

def del_double(str):
  str = str.replace("++", "+")
  str = str.replace("--", "-")
  str = str.replace("+-","-")
  str = str.replace("- -","-")
  str = str.replace("+ +","+")
  return str

3、然后依次从里到外去除括号并进行计算,和位置替换

calc_input = calc_input.replace(inner.group(), str(ret))

将计算出来的结果分别替换原计算公式

4、最后得出没有括号的公式,合并调用计算控制函数进行计算,中间需要注意的就是 负号 和数字与*在一起的处理,其它还算可以。

具体逻辑思路图是:

Python设计实现的计算器功能完整实例

以下是完整的代码:

#!/usr/bin/env python3.5
# -*-coding:utf8-*-
import re
a =r'1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2))'
# */运算函数
def shengchu(str):
  calc = re.split("[*/]",str)   #用*/分割公式
  OP = re.findall("[*/]",str)  #找出所有*和/号
  ret = None
  for index,i in enumerate(calc):
    if ret:
      if OP[index-1] == "*":
        ret *= float(i)
      elif OP[index-1] == "/":
        ret /= float(i)
    else:
      ret = float(i)
  return ret
# 去掉重复运算,和处理特列+-符号
def del_double(str):
  str = str.replace("++", "+")
  str = str.replace("--", "-")
  str = str.replace("+-","-")
  str = str.replace("- -","-")
  str = str.replace("+ +","+")
  return str
# 计算主控制函数
def calc_contrl(str):
  tag = False
  str = str.strip("()") # 去掉最外面的括号
  str = del_double(str) # 调用函数处理重复运算
  find_ = re.findall("[+-]",str) # 获取所有+- 操作符
  split_ = re.split("[+-]",str) #正则处理 以+-操作符进行分割,分割后 只剩*/运算符
  if len(split_[0].strip()) == 0: # 特殊处理
    split_[1] = find_[0] + split_[1] # 处理第一个数字前有“-”的情况,得到新的带符号的数字
    # 处理第一个数字前为负数“-",时的情况,可能后面的操作符为“-”则进行标记
    if len(split_) == 3 and len(find_) ==2:
      tag =True
      del split_[0] # 删除原分割数字
      del find_[0]
    else:
      del split_[0] # 删除原分割数字
      del find_[0] # 删除原分割运算符
  for index, i in enumerate(split_):
    # 去除以*或/结尾的运算数字
    if i.endswith("* ") or i.endswith("/ "):
      split_[index] = split_[index] + find_[index] + split_[index+1]
      del split_[index+1]
      del find_[index]
  for index, i in enumerate(split_):
    if re.search("[*/]",i): # 先计算含*/的公式
      sub_res = shengchu(i) #调用剩除函数
      split_[index] = sub_res
  # 再计算加减
  res = None
  for index, i in enumerate(split_):
    if res:
      if find_[index-1] == "+":
        res += float(i)
      elif find_[index-1] == "-":
        # 如果是两个负数相减则将其相加,否则相减
        if tag == True:
          res += float(i)
        else:
          res -= float(i)
    else:
      # 处理没有括号时会出现i 为空的情况
      if i != "":
        res = float(i)
  return res
if __name__ == '__main__':
  calc_input = input("请输入计算公式,默认为:%s:" %a).strip()
  try:
    if len(calc_input) ==0:
      calc_input = a
    calc_input = r'%s'%calc_input # 做特殊处理,保持字符原形
    flag = True  # 初始化标志位
    result = None  # 初始化计算结果
    # 循环处理去括号
    while flag:
      inner = re.search("\([^()]*\)", calc_input)# 先获取最里层括号内的单一内容
      #print(inner.group())
      # 有括号时计算
      if inner:
        ret = calc_contrl(inner.group()) # 调用计算控制函数
        calc_input = calc_input.replace(inner.group(), str(ret)) # 将运算结果,替换原处理索引值处对应的字符串
        print("处理括号内的运算[%s]结果是:%s" % (inner.group(),str(ret)))
        #flag = True
      # 没有括号时计算
      else:
        ret = calc_contrl(calc_input)
        print("最终计算结果为:%s"% ret)
        #结束计算标志
        flag = False
  except:
    print("你输入的公式有误请重新输入!")
Python 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
520使用Python实现“我爱你”表白
May 20 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 #Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 #Python
对python中return和print的一些理解
Aug 18 #Python
浅析Python中return和finally共同挖的坑
Aug 18 #Python
Python多进程multiprocessing用法实例分析
Aug 18 #Python
利用python求相邻数的方法示例
Aug 18 #Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 #Python
You might like
一个基于PDO的数据库操作类(新) 一个PDO事务实例
2011/07/03 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
Python中DJANGO简单测试实例
2015/05/11 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Python如何获取文件指定行的内容
2020/05/27 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
医生自荐信
2013/10/11 职场文书
班长岗位职责
2013/11/10 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
计生个人工作总结
2015/02/28 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL