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) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- #-Author-Lian
- import re
- def operator_update(formula):
- # 对formula公式进行 去除空字符,更新运算符处理
- formula = formula.replace(" ", "") # 去除空字符
- formula=formula.replace("+-","-")
- formula=formula.replace("--", "+")
- return formula
- def calc_muldiv(formula_list):
- '''
- 计算公式里面的乘除
- :param formula: 列表
- :return:
- '''
- for index,element in enumerate(formula_list):
- if "*" in element or "/" in element:
- operators=re.findall("[*/]",element)
- calc_list=re.split("[*/]",element)
- num = None
- for i,e in enumerate(calc_list):
- if num:
- if operators[i-1] == "*":
- num *= float(e)
- elif operators[i-1] == "/":
- num /= float(e)
- else:
- num = float(e)
- formula_list[index] = num
- return formula_list
- def calc_plumin(operators,num_list):
- '''
- 计算列表数字的加减
- :param operators: 运算符列表
- :param num_list: 进行运算的数字列表
- :return: 返回计算结果
- '''
- num = None
- for i, e in enumerate(num_list):
- if num:
- if operators[i - 1] == "+":
- num += float(e)
- elif operators[i - 1] == "-":
- num -= float(e)
- else:
- num = float(e)
- return num
- def merge(plus_minus_operator,multiply_divide_list):
- '''
- 把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块
- :param formula_list:
- :return:
- '''
- for index, element in enumerate(multiply_divide_list):
- if element.endswith("*") or element.endswith("/"):
- multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index+1]
- del multiply_divide_list[index+1]
- del plus_minus_operator[index]
- return merge(plus_minus_operator,multiply_divide_list)
- return plus_minus_operator,multiply_divide_list
- def bracket_calc(formula):
- '''
- 对括号最内层的formula公式进行计算
- :param formula:
- :return:
- '''
- formula = re.sub("[()]", "", formula) # 去除两边的()
- formula = operator_update(formula)
- plus_minus_operator = re.findall("[+-]",formula) #列表 '+' '-' 运算符
- multiply_divide_list = re.split("[+-]",formula) #列表 有'*' '/'
- if multiply_divide_list[0] == "": #multiply_divide_list列表第一个字符为空的话,表示一个数字为负号
- multiply_divide_list[1] = "-" + multiply_divide_list[1]
- del plus_minus_operator[0]
- del multiply_divide_list[0]
- res = merge(plus_minus_operator,multiply_divide_list)
- plus_minus_operator=res[0] #列表 '+' '-' 运算符 进行合并处理
- multiply_divide_list=res[1]
- plus_minus_list=calc_muldiv(multiply_divide_list) #生成只进行加减运算的列表
- res=calc_plumin(plus_minus_operator,plus_minus_list)
- return res
- def calculate(formula):
- '''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
- while True:
- formula_depth = re.search("\([^()]+\)", formula)
- if formula_depth:
- formula_depth=formula_depth.group()
- res=bracket_calc(formula_depth)
- formula=formula.replace(formula_depth,str(res))
- print("\33[34;1m%s\33[0m"%(formula))
- else:
- res = bracket_calc(formula)
- print("\33[31;1m结果:%s\33[0m"%(res))
- exit()
- if __name__ == '__main__':
- 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) )"
- calculate(formula)
- #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) )
- #1 - 2 * ( (60-30 +-74.26666666666667 * 173520.88095238098) -(-4*3)/ (16-3*2) )
- #1 - 2 * ( -12886787.425396826 -(-4*3)/ (16-3*2) )
- #1 - 2 * ( -12886787.425396826 --12.0/ (16-3*2) )
- #1 - 2 * ( -12886787.425396826 --12.0/ 10.0 )
- #1 - 2 * -12886786.225396827
- #结果:25773573.450793654
Python开发【程序】:计算器的更多相关文章
- 用Python开发实用程序 – 计算器
一段时间前,自己制作了一个库 “sui-math”.这其实是math的翻版.做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于 ...
- Python开发程序:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- Python开发程序:FTP程序
作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...
- (转)Python开发程序:支持多用户在线的FTP程序
原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
- Python开发程序:选课系统-改良版
程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- Python开发程序:RPC异步执行命令(RabbitMQ双向通信)
RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...
- Python开发程序:选课系统
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- Python开发程序:简单主机批量管理工具
题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...
- Python开发程序:ATM+购物商城
一.程序要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还 ...
随机推荐
- 【BZOJ1984】月下“毛景树” 树链剖分+线段树
[BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...
- mysql修改默认编码为UTF8
Linux下一般是 /etc/my.cnf --在 [mysqld] 标签下加上三行default-character-set = utf8character_set_server = utf8 -- ...
- css3+js打造炫酷图片展示
<!DOCTYPE html> <html onselectstart="return false"> <!-- onselectstart=&quo ...
- 【CF】148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题意:w个白b个黑,公主和龙轮流取,公主先取,等概率取到一个.当龙取完后,会等概率跳出一只.(0<= ...
- BZOJ4500: 矩阵
Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 1. 选择一行, 该行每个格子的权值加1或减1. 2. 选择一列, 该列每个格子的权值加1或减1. 现在 ...
- 让 cell 显示底部线条时,总是有几个线条被隐藏.
一,经历 1> 感觉像是重用的问题,但从代码的分析中找不出任何问题. 2> 感觉像是我 在创建怎样的 cell 的代码 被 layoutsubviews 方法覆盖了一样.于是先在创建怎样的 ...
- js之获取窗口大小和位置信息
除IE外的浏览器查看窗口大小和位置信息: //The overall size of the browser window on the desktop var windowWidth = windo ...
- 在线阅读android源代码
这两天一直在寻找android系统的源代码,但是直到一个小时之前,一直未能如愿.但是,令人欣慰的是,现在找到了. 网上有不少帖子介绍如何下载android源代码,包括在linux系统,windows系 ...
- ellipsis
语法: text-overflow : clip | ellipsis 参数: clip : 不显示省略标记(...),而是简单的裁切(clip这个参数是不常用的!) ellipsis ...
- CSS3初学篇章_4(边框样式/段落样式)
边框样式 1.边框线语法:border-style : none | hidden | dotted | dashed | solid | double | groove | ridge | inse ...