开发一个简单的python计算器

  1. 实现加减乘除及拓号优先级解析
  2. 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. #-Author-Lian
  4. import re
  5.  
  6. def operator_update(formula):
  7. # 对formula公式进行 去除空字符,更新运算符处理
  8. formula = formula.replace(" ", "") # 去除空字符
  9. formula=formula.replace("+-","-")
  10. formula=formula.replace("--", "+")
  11. return formula
  12.  
  13. def calc_muldiv(formula_list):
  14. '''
  15. 计算公式里面的乘除
  16. :param formula: 列表
  17. :return:
  18. '''
  19. for index,element in enumerate(formula_list):
  20. if "*" in element or "/" in element:
  21. operators=re.findall("[*/]",element)
  22. calc_list=re.split("[*/]",element)
  23. num = None
  24. for i,e in enumerate(calc_list):
  25. if num:
  26. if operators[i-1] == "*":
  27. num *= float(e)
  28. elif operators[i-1] == "/":
  29. num /= float(e)
  30. else:
  31. num = float(e)
  32. formula_list[index] = num
  33. return formula_list
  34.  
  35. def calc_plumin(operators,num_list):
  36. '''
  37. 计算列表数字的加减
  38. :param operators: 运算符列表
  39. :param num_list: 进行运算的数字列表
  40. :return: 返回计算结果
  41. '''
  42. num = None
  43. for i, e in enumerate(num_list):
  44. if num:
  45. if operators[i - 1] == "+":
  46. num += float(e)
  47. elif operators[i - 1] == "-":
  48. num -= float(e)
  49. else:
  50. num = float(e)
  51. return num
  52.  
  53. def merge(plus_minus_operator,multiply_divide_list):
  54. '''
  55. 把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块
  56. :param formula_list:
  57. :return:
  58. '''
  59. for index, element in enumerate(multiply_divide_list):
  60. if element.endswith("*") or element.endswith("/"):
  61. multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index+1]
  62. del multiply_divide_list[index+1]
  63. del plus_minus_operator[index]
  64. return merge(plus_minus_operator,multiply_divide_list)
  65. return plus_minus_operator,multiply_divide_list
  66.  
  67. def bracket_calc(formula):
  68. '''
  69. 对括号最内层的formula公式进行计算
  70. :param formula:
  71. :return:
  72. '''
  73. formula = re.sub("[()]", "", formula) # 去除两边的()
  74. formula = operator_update(formula)
  75. plus_minus_operator = re.findall("[+-]",formula) #列表 '+' '-' 运算符
  76. multiply_divide_list = re.split("[+-]",formula) #列表 有'*' '/'
  77. if multiply_divide_list[0] == "": #multiply_divide_list列表第一个字符为空的话,表示一个数字为负号
  78. multiply_divide_list[1] = "-" + multiply_divide_list[1]
  79. del plus_minus_operator[0]
  80. del multiply_divide_list[0]
  81. res = merge(plus_minus_operator,multiply_divide_list)
  82. plus_minus_operator=res[0] #列表 '+' '-' 运算符 进行合并处理
  83. multiply_divide_list=res[1]
  84. plus_minus_list=calc_muldiv(multiply_divide_list) #生成只进行加减运算的列表
  85. res=calc_plumin(plus_minus_operator,plus_minus_list)
  86. return res
  87.  
  88. def calculate(formula):
  89. '''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
  90. while True:
  91. formula_depth = re.search("\([^()]+\)", formula)
  92. if formula_depth:
  93. formula_depth=formula_depth.group()
  94. res=bracket_calc(formula_depth)
  95. formula=formula.replace(formula_depth,str(res))
  96. print("\33[34;1m%s\33[0m"%(formula))
  97. else:
  98. res = bracket_calc(formula)
  99. print("\33[31;1m结果:%s\33[0m"%(res))
  100. exit()
  101.  
  102. if __name__ == '__main__':
  103. formula = "1 - 2 * ( (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"
  104. calculate(formula)
  105.  
  106. #1 - 2 * ( (60-30 +-74.26666666666667 * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )
  107. #1 - 2 * ( (60-30 +-74.26666666666667 * 173520.88095238098) -(-4*3)/ (16-3*2) )
  108. #1 - 2 * ( -12886787.425396826 -(-4*3)/ (16-3*2) )
  109. #1 - 2 * ( -12886787.425396826 --12.0/ (16-3*2) )
  110. #1 - 2 * ( -12886787.425396826 --12.0/ 10.0 )
  111. #1 - 2 * -12886786.225396827
  112. #结果:25773573.450793654

  

Python开发【程序】:计算器的更多相关文章

  1. 用Python开发实用程序 – 计算器

    一段时间前,自己制作了一个库 “sui-math”.这其实是math的翻版.做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于 ...

  2. Python开发程序:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  3. Python开发程序:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  4. (转)Python开发程序:支持多用户在线的FTP程序

    原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...

  5. Python开发程序:学员管理系统(mysql)

    主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...

  6. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  7. Python开发程序:RPC异步执行命令(RabbitMQ双向通信)

    RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...

  8. Python开发程序:选课系统

    本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  9. Python开发程序:简单主机批量管理工具

    题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...

  10. Python开发程序:ATM+购物商城

    一.程序要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还 ...

随机推荐

  1. 【BZOJ1984】月下“毛景树” 树链剖分+线段树

    [BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...

  2. mysql修改默认编码为UTF8

    Linux下一般是 /etc/my.cnf --在 [mysqld] 标签下加上三行default-character-set = utf8character_set_server = utf8 -- ...

  3. css3+js打造炫酷图片展示

    <!DOCTYPE html> <html onselectstart="return false"> <!-- onselectstart=&quo ...

  4. 【CF】148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题意:w个白b个黑,公主和龙轮流取,公主先取,等概率取到一个.当龙取完后,会等概率跳出一只.(0<= ...

  5. BZOJ4500: 矩阵

    Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 1. 选择一行, 该行每个格子的权值加1或减1. 2. 选择一列, 该列每个格子的权值加1或减1. 现在 ...

  6. 让 cell 显示底部线条时,总是有几个线条被隐藏.

    一,经历 1> 感觉像是重用的问题,但从代码的分析中找不出任何问题. 2> 感觉像是我 在创建怎样的 cell 的代码 被 layoutsubviews 方法覆盖了一样.于是先在创建怎样的 ...

  7. js之获取窗口大小和位置信息

    除IE外的浏览器查看窗口大小和位置信息: //The overall size of the browser window on the desktop var windowWidth = windo ...

  8. 在线阅读android源代码

    这两天一直在寻找android系统的源代码,但是直到一个小时之前,一直未能如愿.但是,令人欣慰的是,现在找到了. 网上有不少帖子介绍如何下载android源代码,包括在linux系统,windows系 ...

  9. ellipsis

    语法:  text-overflow : clip | ellipsis 参数:  clip : 不显示省略标记(...),而是简单的裁切(clip这个参数是不常用的!)      ellipsis ...

  10. CSS3初学篇章_4(边框样式/段落样式)

    边框样式 1.边框线语法:border-style : none | hidden | dotted | dashed | solid | double | groove | ridge | inse ...