import re

def format_string(s):             # 对表达式进行格式化
s = s.replace(' ', '')
s = s.replace("--", "+")
s = s.replace("++", "+")
s = s.replace("+-", "-")
s = s.replace("*+", "*")
s = s.replace("/+", "/")
return s def check_expression(s): # 对表达式进行检测
flag = True
if not s.count("(") == s.count(")"):
print("括号没有闭合")
flag = False
if re.findall('[a-z]+', s.lower()):
print("有非法字符")
flag = False return flag def calc_mul_div(s):
regular = '[\-]?\d+\.?\d*[*/][\-]?\d+\.?\d*' while re.findall(regular, s):
expression = re.search(regular, s).group() if expression.count("*"): # 判断是否是乘法
x, y = expression.split("*")
mul_result = str(float(x) * float(y))
s = s.replace(expression, mul_result)
s = format_string(s) if expression.count("/"): # 判断是否是除法
x, y = expression.split('/')
div_result = str(float(x) / float(y))
s = s.replace(expression, div_result)
s = format_string(s) return s def calc_add_sub(s): # 判断加减法
add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*' while re.findall(add_regular, s):
add_list = re.findall(add_regular, s)
for add_str in add_list:
x, y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
s = s.replace(add_str, add_result)
s = format_string(s) while re.findall(sub_regular, s):
sub_list = re.findall(sub_regular, s)
for sub_str in sub_list:
numbers = sub_str.split("-")
if len(numbers) == 3: # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
# 如果表达式类似 8-2, 则 list 是 ['8', '2']
result = 0
for v in numbers:
if v:
result -= float(v)
else:
x, y = numbers
result = float(x) - float(y)
s = s.replace(sub_str, "+" + str(result))
s = format_string(s) return s if __name__ == "__main__":
s = '(( 2 /1 * 7 ) - ( 3 *4 ) )' if check_expression(s):
s = format_string(s) while s.count("(") > 0:
strs = re.search('\([^()]*\)', s).group()
replace_str = calc_mul_div(strs) replace_str = calc_add_sub(replace_str) s = format_string(s.replace(strs, replace_str[1:-1])) # 去掉多余的括号 else:
replace_str = calc_mul_div(s) replace_str = calc_add_sub(replace_str) s = s.replace(s, replace_str) print("result: ", s.replace("+", "")) 运行结果:
result: 2.0

Python 练习: 计算器的更多相关文章

  1. 从零开始学习PYTHON3讲义(二)把Python当做计算器

    <从零开始PYTHON3>第二讲 上一讲我们说过了如何启动Python IDLE集成开发学习环境,macOS/Linux都可以在命令行执行idle3.Windows则从开始菜单中去寻找ID ...

  2. python实现计算器

    计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...

  3. python之计算器(第四天)

    作业: 使用正则表达式和递归实现计算器功能. 实现: 1.实现带括号的计算 2.实现指数.加减乘除求余等功能 一.实例说明: 本实例自己写了个版本,但依旧存在一点bug,例:-2-2等计算问题,故最后 ...

  4. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

  5. Python科学计算器(计算器)

    说明 该计算器主要是为了练习正则表达式以及python基础所写:代码比较low! 运行过程 请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit) MyC ...

  6. Python数学运算入门把Python当作计算器

    让我们尝试一些简单的 Python 命令.启动解释器,等待界面中的提示符,>>> (这应该花不了多少时间). 3.1.1. 数字 解释器就像一个简单的计算器一样:你可以在里面输入一个 ...

  7. python之计算器

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

  8. [IT学习]转载python 项目 计算器

    这个是从网上搜到的Python小项目之计算器(原文地址:http://www.2cto.com/kf/201402/279637.html).但该段代码估计是Python 2 写的. 如果你使用的程序 ...

  9. python编写计算器

    程序代码 # coding: utf-8# 将tkinter改为Tkinter兼容Python 2.xfrom tkinter import *class App: def __init__(self ...

  10. python写计算器

    #!/usr/bin/env python # -*- coding:utf-8 -*- import re def chu(arg1): #定义加减 arg = arg1[0] #beacuse p ...

随机推荐

  1. JDBC创建链接的几种方式

    首先,使用java程序访问数据库的前提 数据库的主机地址(ip地址) 端口 数据库用户名 数据库用户密码 连接的数据库 代码: private static String url = "jd ...

  2. c++ 异常处理(2)

    前面一篇博文简单介绍了 c++ 异常处理的流程,但在一些细节上一带而过了,比如,_Unwind_RaiseException 是怎样重建函数现场的,Personality routine 是怎样清理栈 ...

  3. Alpha冲刺(5/10)——2019.4.28

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(5/10)--2019.4.28 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  4. Python selenium + Firefox启动浏览器

    Python selenium 的运用 from selenium import webdriver # from selenium.webdriver.firefox.firefox_profile ...

  5. java visualVM(jconsole)远程监控服务器java进程

    1. JMX方式(jconsole也可通过此方式进行连接) jmx方式能监控到CPU信息,但无法使用visualVM的visualVM GC插件    jmx无密码方式 监控普通的java进程 . 设 ...

  6. JavaScript概述-第1章

    目录 初始JavaScript 学会使用编辑工具 如何引入脚本代码 常用语句 常见浏览器兼容性问题 了解前端开发技术JavaScript,JavaScript的发展,JavaScript特点,Java ...

  7. 转---JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制

    作者:德来 segmentfault.com/a/1190000004292479 如有好文章投稿,请点击 → 这里了解详情 一.从一个面试题说起 面试前端的时候我喜欢问一些看上去是常识的问题.比如: ...

  8. IntelliJ IDEA 注册码(因为之前的地址被封杀了,所以换了个地址)

    附上IntelliJ IDEA 注册码(感谢提供注册码的大神):http://idea.qinxi1992.cn/(已封杀) http://idea.lanyus.com/(新地址) 注:以前直接复制 ...

  9. maven 下载镜像文件卡,下载pom文件慢的问题

    问题原因: maven默认的镜像库URL为 http://maven.net.cn/content/groups/public/ 由于网络原因,可能导致响应速度超级慢,或者无法效应: 解决方法: 配置 ...

  10. ubuntu 16.04 下更换boost版本

    如果是新机器,没装过boost,那么直接一条命令 sudo apt-get install libboost-all-dev 头文件一般安装在 /usr/include 下面有一个目录boost,里面 ...