开发一个简单的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开发之【简单计算器】的更多相关文章

  1. python正则实现简单计算器

    利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...

  2. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  3. IOS开发之简单计算器

    用Object-C写的一个简单的计算机程序,主要学习按钮的action动作. 以下是主界面: 以下代码时界面按钮和ViewController.h连接的地方: - (IBAction)button_0 ...

  4. Python开发桌面微型计算器

    开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器 ...

  5. Python开发的简单记事本

    ---恢复内容开始---               主要是利用python 自带的tkinter 库    程序的基于python3.0以上 ,各个平台都可以使用包括linux ,windows , ...

  6. Python之实现简单计算器功能

    一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...

  7. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题

    今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...

  8. Python学习笔记-CGI编程(如何在IIS上挂Python开发的Webservice)

    一.如何用Python开发一个简单的Webservice 利用python的cgi编程,可以传入参数将结果输出. 定义需要编码以及需要引用的模块 #conding=utf-8 #修正中文乱码 impo ...

  9. 作业1开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

随机推荐

  1. JS Date.Format

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  2. 根据Expander的IsExpanded属性值的变化动态设计Control的size

    简要说明: 当Expander 的IsExpanded属性为“True” 时给控件设个尺寸(此处为高度),当为“False”时给控件设另外一个值. 知识点:数据绑定.Style和Trigger < ...

  3. datagrid动态数据添加超链接的方法

    首先,我我们要有一个json格式的datagrid_data.json文件,如下:

  4. Windows nexus 启动失败

    现象: nexus Windows系统服务安装成功,但启动失败 D:\nexus-2.10.0-02-bundle\nexus-2.10.0-02\bin>nexus.bat Usage: ne ...

  5. 小白学Linux(四)--系统常用命令

    这里记录一下基础的系统常用命令,都是日常可能用到的,需要记住的一些命令.主要分为5个模块:关于时间,输出/查看,关机/重启,压缩归档和查找. 时间:      date :查看设置当前系统时间,dat ...

  6. [moka同学收藏]Yii2.0 rules验证规则

    required : 必须值验证属性 [['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredV ...

  7. jar包和war包的区别(转)

    jar包和war包的区别:war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...

  8. Java final static abstract关键字介绍

    一,抽象类:abstract 1,只要有一个或一个以上抽象方法的类,必须用abstract声明为抽象类; 2,抽象类中可以有具体的实现方法; 3,抽象类中可以没有抽象方法; 4,抽象类中的抽象方法必须 ...

  9. 前端技巧:禁止浏览器static files缓存篇(转)

    前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...

  10. html alert 的三种方式

    html alert 一共有三种方式. 第一种是最简单的直接在js的函数里alert("要输出的内容"); 这种直接就是一个弹出框,显示要输出的内容. 第二种是带选择的弹出框,弹出 ...