用python编写一个计算器
# 1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2)))
# 通过Python实现,自动判断括号以及加减乘除的运算优先级,得出运算结果,显示运算步骤
import re
def atom_cal(exp):
if '*' in exp: #计算单个的乘法
a,b = exp.split('*')
return str(float(a) * float(b))
elif '/' in exp: #计算单个的除法
a, b = exp.split('/')
return str(float(a) / float(b)) def format_exp(exp): #处理符号的问题
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp def mul_div(exp): #计算乘除法
while True:
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) #利用正则表达式匹配乘或除法
if ret: #如果匹配到的话
atom_exp = ret.group() #将这个值拿出来
res = atom_cal(atom_exp) #利用上面的atom_exp计算
exp = exp.replace(atom_exp,res) #将计算的结果把原来算法替换掉
else:return exp #如果匹配不到的话说明乘除法计算完毕,返回计算结果 def add_sub(exp): #计算加减法
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp) #利用正则表达式算式中的带符号的每项数字,返回一个列表
exp_sum = 0
for i in ret:
exp_sum += float(i) #将列表中的每一项求和
return exp_sum def cal(exp): #计算加减乘除混合运算
exp = mul_div(exp) #调用mul_div函数先计算乘除法
exp = format_exp(exp) #调用format_exp处理计算时候的符号
exp_sum = add_sub(exp) #调用 add_sub计算加减法
return exp_sum # float #返回计算结果 def main(exp):
exp = exp.replace(' ','') #删除字符串中的空格
while True:
ret = re.search('\([^()]+\)',exp) #匹配括号
if ret : #如果匹配到括号的话
inner_bracket = ret.group() #将匹配到的括号内容取出来
res = str(cal(inner_bracket)) #调用cal()计算括号中的内容,将返回结果转换成字符串
exp = exp.replace(inner_bracket,res) #将匹配到的括号内容用计算器结果替换
exp = format_exp(exp) #处理符号
else:break #直到没有括号跳出循环
return cal(exp) #将剩下的内容进行计算,然后返回 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
ret = main(s)
print(ret,type(ret))
用python编写一个计算器的更多相关文章
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 使用 python 编写一个授权登录验证的模块
使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...
- C#编写一个计算器
编写一个计算器,练习在窗体上添加控件.调整控件的布局,设置或修改控件属性,编写事件处理程序的方法. 代码: using System; using System.Collections.Generic ...
- 如何用Python写一个计算器软件 附带效果图
该计算器使用Python tkinter模块开发 效果如下图 import tkinter #导入tkinter模块 root = tkinter.Tk() root.minsize(280,500 ...
- Python 编写一个有道翻译的 workflow 教程
最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...
- 如何用Python编写一个聊天室
一.课程介绍 1.简介 本次项目课是实现简单聊天室程序的服务器端和客户端. 2.知识点 服务器端涉及到asyncore.asynchat和socket这几个模块,客户端用到了telnetlib.wx. ...
- 为Python编写一个简单的C语言扩展模块
最近在看pytorh方面的东西,不得不承认现在这个东西比较火,有些小好奇,下载了代码发现其中计算部分基本都是C++写的,这真是要我对这个所谓Python语音编写的框架或者说是库感觉到一丢丢的小失落,细 ...
- 用python编写一个合格的ftp程序,思路是怎样的?
经验1.一般在比较正规的类中的构造函数.都会有一个verify_args函数,用于验证传入参数.尤其是对于系统传参.2.并且系统传参,其实后面大概都是一个函数名 例如:python server. ...
- Python编写一个Python脚本
我想要一个可以为我的所有重要文件创建备份的程序.(下面测试环境为python2.7) 1.backup_ver1.py #!/usr/bin/python import os import time ...
随机推荐
- javascript中获取class
js中没有获取class的办法,找了一些封装好的方法,这里整理一下 (1)先进行封装 //封装getClass function getClass(tagName,className) //获得标签名 ...
- datagrid 行号问题综合
1.datagrid 左侧行号设置宽度 : 到 easyui.css 中修改 .datagrid-cell-rownumber 中 width 的宽度.
- 在新建FileInputStream时使用当前相对路径或者绝对路径作为参数的问题
今天在写一个关于配置Excel导出路径通过properties文件配置的需求,通过查询我得知 properties文件通过 FileInputStream 读取
- 详解linux中install命令和cp命令的区别
基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务——拷贝文件,它们之间的区别主要如下: .最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件, ...
- POJ3061 Subsequence
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16520 Accepted: 7008 Desc ...
- No java virtual machine ....
运行Eclipse提示No java virtual machine 版权声明:本文原创作者:一叶飘舟 作者博客地址:http://blog.csdn.net/jdsjlzx http://blo ...
- w3C盒子模型和IE的盒子模型
W3C 盒子模型的范围包括 margin.border.padding.content,并且 content 部分不包含其他部分IE 盒子模型的范围也包括 margin.border.padding. ...
- TQ210 —— S5PV210 uboot顶层Makefile分析
转自:http://blog.csdn.net/wqx521/article/details/52469759 # (C) Copyright 2000-2008 # Wolfgang Denk, D ...
- PB调用C# Windows窗体
以下是PB中的代码:String ls_filenameLong ll_wstyle=1long ll_hwnd,ll_nShowCmdstring ls_lpOperation,ls_lpFile, ...
- 1.18-1.21 Oozie Coordinator调度
一.时区问题 1.修改系统时区 ## [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# rm -rf /etc/localtime [root@hadoop-se ...