用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 ...
随机推荐
- Codeforces Round #261 (Div. 2) B. Pashmak and Flowers 水题
题目链接:http://codeforces.com/problemset/problem/459/B 题意: 给出n支花,每支花都有一个漂亮值.挑选最大和最小漂亮值得两支花,问他们的差值为多少,并且 ...
- RobotFramework教程使用笔记——Selenium2Library库
selenium之前已经学习介绍过了,它是一个支持多语言.多平台.多浏览器的web自动化测试框架,在robotframework中也可以导入selenium库来进行web自动化测试.它使用seleni ...
- ios非UTF-8格式的网页解析
网上有很多关于ios xml解析的方法,关于非UTF-8格式的网页解析也不少,我也试着看了好几个,但都没成功.今天无意中却弄好了,所以想和大家分享下.其实很简单,下面说下怎么得到非UTF-8格式的网页 ...
- Android图片加载神器之Fresco, 基于各种使用场景的讲解
Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理 ...
- 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2
from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...
- reactjs的一些笔记
1.使用虚拟DOM作为其不同的实现.同时可以由服务器node.js渲染,从而不需要过重的浏览器DOM支持. 2.虚拟DOM:在浏览器端用javascript实现了一套DOM API.用react开 ...
- windows下使用emacs+plink远程编辑erlang文件
1)plink.exe属于putty套件, 注册到环境变量;emacs的bin目录也要注册到环境变量中; 2)在.emacs中增加如下: (require 'tramp)(setq tramp-def ...
- js中this 的四种用法
this 在函数执行时,this 总是指向调用该函数的对象.要判断 this 的指向,其实就是判断 this 所在的函数属于谁. 在<javaScript语言精粹>这本书中,把 this ...
- 实用的MVVM:ImageView
最近在学习WPF,遇到一本入门好书,推荐给大家<Windows Presentation Foundation 4.5 Cookbook> 做项目首先要从MVVM开始,现在把他的Simpl ...
- 小程序wx:key中的关键字*this
“保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如果是对象则不可以 data:{ array:[1,2,3,4,5], ob ...