Python开发之【简单计算器】
开发一个简单的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等类似功能实现), 运算后得出结果,结果必须与真实的计算器所得出的结果一致
分析:
一、判断用户输入的公式是否正确(下面只做了4条,其它暂无添加)
1、先去除空格
2、不能出现字母
3、"("与")"必须配对
4、+、-、*、/不能重复
二、考虑优先级,先算()内部,再算*/,最后算+-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
from functools import reduce # 检查表达式合法性
def check_formula(formula):
tag = True
if re.findall("[a-zA-Z]", formula): # 包含字母
tag = False
if not len(re.findall("\(", formula)) == len(re.findall("\)", formula)): # (与)不匹配
tag = False
if re.findall("\(\)", formula): # 只出现()
tag = False
return tag # 去掉重复的运算符
def repeat_operator(formula):
formula = formula.replace("++", "+")
formula = formula.replace("-+", "-")
formula = formula.replace("+-", "-")
formula = formula.replace("--", "+")
return formula # 计算乘除运算
def count_mul_div(formula):
is_have_muldiv = re.search("\d+\.?\d*[*/]\-?\d+\.?\d*", formula) # 匹配含有*/运算的表达式
if is_have_muldiv:
bracketin_formula = is_have_muldiv.group()
x, y = re.split("[*/]", bracketin_formula) # 以*或/分割得到两个数据
mul_or_div = re.search("[*/]", bracketin_formula).group() # 获取运算符
if mul_or_div == "*":
operation_result = float(x) * float(y)
else:
operation_result = float(x) / float(y)
operation_result = str(operation_result)
formula = formula.replace(bracketin_formula, operation_result) # 将乘除结果替换上面找到的乘除运算
return count_mul_div(formula) # 有*/,继续调用自己做乘除
else:
return count_add_sub(formula) # 没有*/,调用加减计算 # 计算加减运算
def count_add_sub(formula):
formula = repeat_operator(formula)
is_have_muldiv = re.search("\-?\d+\.?\d*[+\-]\d+\.?\d*", formula) # 匹配含有+-运算的表达式
if is_have_muldiv:
bracketin_formula = is_have_muldiv.group()
nums_list = re.findall("\-?\d+\.?\d*", bracketin_formula) # 匹配除+号外的数字
operation_result = reduce(lambda x, y: float(x) + float(y), nums_list) # reduce求和
operation_result = str(operation_result)
formula = formula.replace(bracketin_formula, operation_result) # 将加减结果替换上面找到的加减运算
return count_add_sub(formula) # 继续调用自己做加减运算
else:
formula = formula.strip("()") # 将运算结果外面()去掉
return formula # 没有+-,运算完成,返回运算结果 # 主逻辑
while True:
formula = re.sub(" +", "", input("请输入数学表达式或按q退出:")) # 输入表达式,去除空格
result = None
if formula.lower() == "q":
break
else:
if check_formula(formula): # 判断表达式合法性
is_bracket_flag = True
while is_bracket_flag:
formula = repeat_operator(formula) # 去除重复运算符
bracket_bestin = re.search("\([^()]*\)", formula) # 找最内层括号
if bracket_bestin:
bracket_bestin = bracket_bestin.group()
result = count_mul_div(bracket_bestin) # 调用乘除计算
formula = formula.replace(bracket_bestin, result) # 替换原表达式的内层括号
else:
is_bracket_flag = False # 找不到括号
result = count_mul_div(formula) # 调用乘除计算
else:
print("输入表达式有误!")
if result:
print(result)
代码
Python开发之【简单计算器】的更多相关文章
- python正则实现简单计算器
利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...
- Python开发一个简单的BBS论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- IOS开发之简单计算器
用Object-C写的一个简单的计算机程序,主要学习按钮的action动作. 以下是主界面: 以下代码时界面按钮和ViewController.h连接的地方: - (IBAction)button_0 ...
- Python开发桌面微型计算器
开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器 ...
- Python开发的简单记事本
---恢复内容开始--- 主要是利用python 自带的tkinter 库 程序的基于python3.0以上 ,各个平台都可以使用包括linux ,windows , ...
- Python之实现简单计算器功能
一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...
- python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...
- Python学习笔记-CGI编程(如何在IIS上挂Python开发的Webservice)
一.如何用Python开发一个简单的Webservice 利用python的cgi编程,可以传入参数将结果输出. 定义需要编码以及需要引用的模块 #conding=utf-8 #修正中文乱码 impo ...
- 作业1开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
随机推荐
- ok6410 android driver(8)
In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...
- 已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。
错误:已超过传入消息(65536)的最大消息大小配额.若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性. 或者 错误:反序列化操作“GetAllUserData ...
- 字符串与json之间的相互转化
先在数据库中建表: 再从后台将表取出来,然后转化为json格式,再将其执行ToString()操作后,赋值给前台的隐藏域. 注意引用using Newtonsoft.Json; 前台利用js将隐藏域中 ...
- 【C#进阶系列】03 配置文件管理与程序集的引用版本重定向
先来点与标题不相关的: CLR支持两种程序集:弱命名程序集和强命名程序集. 两者的区别在于强命名程序集使用发布者的公钥和私钥进行签名.由于程序集被唯一性地标识,所以当应用程序绑定到强命名程序集时,CL ...
- 10个出色的NoSQL数据库
http://www.infoq.com/research/nosql-databases?utm_source=infoqresearch&utm_campaign=lr-homepage ...
- ViewPager和Fragment的组合使用
如图是效果图用的是Viewpager和fragment来实现的主界面 不过其中的预加载我没有解决 如下是代码代码比较简单 package com.ithello.dingding; import ja ...
- C语言范例学习02
第二章 指针 算是重点吧,这也是C语言的特色啊,直接访问物理存储. 重点: 指针就是一个存放它指向变量地址的变量,好绕口. 区分*在定义是与引用是的作用. 区分*.&的不同. 指针 ...
- ahjesus根据身份证号码获取相关信息(生日,省市县,性别)
使用说明: //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢! var idCard = new IdCard();var msg = ...
- mysql内存消耗分析
最近有些生产服务器老是mysql内存不停得往上涨,开发人员和维护反馈,用了不少的临时表,问题时常线上发生,测试又一直比较难重现. 经观察mysql内存的os占用趋势,发现从8:40开始,mysql内存 ...
- Crash日志符号化
1.符号化crash日志需要3样东西: 1).crash日志本身(如:example.crash),从Xcode的organizer导出或者来自Itunes Connect. 2).crash日志所对 ...