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 ...
随机推荐
- Codeforces Round #313 (Div. 1) B. Equivalent Strings
Equivalent Strings Problem's Link: http://codeforces.com/contest/559/problem/B Mean: 给定两个等长串s1,s2,判断 ...
- html5人物图片360度立体旋转
体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...
- 记录一次Mac虚拟机安装的过程(有图有真相)
这是我今天在公司用Vmware workstation虚拟机安装小狮子的全过程,记录一下没什么特别的用途,希望以后不要忘记,整个过程我总共花了半个多小时,挺快的.确实苹果的系统配上苹果的电脑就是牛叉, ...
- Java Web Cookie
一.什么是cookie? 1.Cookie能使站点跟踪特定访问者的访问次数.最后访问时间和访问者进入站点的路径 2.Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告 3.Cook ...
- MAC 隐藏文件的显示
显示 defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏 defaults write com.apple.finder A ...
- ASP.NET 5新特性
近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...
- XML的解析方式(Java)
dom方式解析 根据XML的层级结构在内存中分配一个树形结构,把XML的标签.属性和文本都封装成对象 优点:如果很方便实现增删改操作 缺点:如果文件过大,会造成内存溢出 sax方式解析 采用事件驱 ...
- Jeff Somers's N Queens Solutions 最快的n皇后算法
/* Jeff Somers * * Copyright (c) 2002 * * jsomers@alumni.williams.edu * or * allagash98@yahoo.com * ...
- wxPython简单入门
wxPython简介 wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的.功能键全的 GUI 用户界面. wxPython 是作为优秀 ...
- android项目中gen目录不能自动生成R.java的原因
1.调用的资源文件不存在:xml文件中有些控件没有关联引用:把项目缺少的文件加上,包括资源文件,如 values中的strings.xml或者图片等资源. 2.项目中缺少必须的系统文件(比如:defa ...