说明

该计算器主要是为了练习正则表达式以及python基础所写:代码比较low!

运行过程

请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit)
MyCalc> 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
-----------
步骤
[] ['-40/5']
(-40/5) 运算结果: -8.0
parenthesis_calc_result: 1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
-----------
步骤
['-', '+', '+'] ['9', '2*5/3', '7/3*99/4*2998', '10*568/14']
(9-2*5/3+7/3*99/4*2998+10*568/14) 运算结果: 173545.88095238098
parenthesis_calc_result: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
-----------
步骤
['-', '-'] ['60', '30', '8.0*173545.88095238098']
(60-30-8.0*173545.88095238098) 运算结果: -1388337.0476190478
parenthesis_calc_result: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
-----------
步骤
[] ['-4*3']
(-4*3) 运算结果: -12.0
parenthesis_calc_result: 1-2*(-1388337.0476190478--12.0/(16-3*2))
-----------
步骤
['-'] ['16', '3*2']
(16-3*2) 运算结果: 10.0
parenthesis_calc_result: 1-2*(-1388337.0476190478+12.0/10.0)
-----------
步骤
['+'] ['-1388337.0476190478', '12.0/10.0']
(-1388337.0476190478+12.0/10.0) 运算结果: -1388335.8476190479
parenthesis_calc_result: 1-2*-1388335.8476190479
-----------
步骤
['-'] ['1', '2*-1388335.8476190479']
1-2*-1388335.8476190479 运算结果: 2776672.6952380957
最后的运算结果: 2776672.6952380957

  

具体代码实现

#/usr/bin/env python3
# _*_ coding: utf-8 _*_
__author__ = 'rianley cheng'
__blog__ ='https://www.cnblogs.com/rianley'
'''
left is too short , I use python ! 数据规范化, 正则拆分,结合运算 打印运算表达式及运算步骤
'''
import re,time def math_legal(num): #判断输入公式是否合法,如包含字符或者特殊字符,做特殊处理
try:
num = float(num)
return True
except (ValueError,TypeError) as diag:
pass def calc_formula(formula): #替换多余的加减操作
formula = formula.replace("++", "+")
formula = formula.replace("+-", "-")
formula = formula.replace("-+", "-")
formula = formula.replace("--", "+")
return formula def match_calc_formula(parenthesises_formula): #匹配加减操作符和加减表达式列表
# 取出圆括号表达式中所有的"+-"号,保存为列表形式,如['-', '+', '+']
# 用"+-"号作为分隔符,将圆括号中的乘除表达式取出,保存为列表形式,如['9', '2*5/3', '7/3*99/4*2998', '10*568/14']
parenthesises_formula = re.sub("[()]", "", parenthesises_formula)
plusminus_operator_list = re.findall("[+-]", parenthesises_formula)
plusminus_expression_list = re.split("[+-]", parenthesises_formula)
if plusminus_expression_list[0] == "":
#圆括号表达式列表中,如果第一个元素为空,则表明第一个元素为一个负数,则"-"号开头,将第一个"-"号合并到列表第一个元素
plusminus_expression_list[1] = plusminus_operator_list[0] + plusminus_expression_list[1]
del plusminus_expression_list[0]
del plusminus_operator_list[0] for i, e in enumerate(plusminus_expression_list):
#处理成正确的结果:['1 * -2', '3 * -5', '6/-3']
e = e.strip()
if e.endswith("*") or e.endswith("/"):
try:
plusminus_expression_list[i] = plusminus_expression_list[i] + plusminus_operator_list[i] + plusminus_expression_list[i + 1]
del plusminus_expression_list[i + 1]
del plusminus_operator_list[i]
except IndexError as diag:
pass
return plusminus_operator_list,plusminus_expression_list def matching_multiply_divide_operator(plusminus_equations): #匹配乘除操作符和乘除表达式列表
operator_list = re.findall("[*/]", plusminus_equations)
value_list = re.split("[*/]", plusminus_equations)
return operator_list,value_list def plus_minus_calc(plusminus_operator_list,plusminus_expression_list): #加减运算
'''对运算公式进行加减运算,返回加减结果'''
plusminus_result = None
for i, e in enumerate(plusminus_expression_list):
match = math_legal(e)
if match == True:
if plusminus_result:
if plusminus_operator_list[i - 1] == "+":
plusminus_result += float(e)
elif plusminus_operator_list[i - 1] == "-":
plusminus_result -= float(e)
else:
plusminus_result = float(e)
else:
print("\33[33;0m输入的公式中包含非数字字符!\33[0m")
print("\33[33;0m尝试运算: %s\33[0m" % e)
e = re.sub("\D", "", e)
if e == "": e = 0
if plusminus_result:
if plusminus_operator_list[i - 1] == "+":
plusminus_result += float(e)
elif plusminus_operator_list[i - 1] == "-":
plusminus_result -= float(e)
else:
try:
plusminus_result = float(e)
except ValueError as diag:
print("\33[33;1m无效输入!\33[0m")
return plusminus_result
def multiply_divide_calc(multiply_divide_operator_list,multiply_divide_value_list): #乘除运算
'''对运算公式进行乘除运算,返回乘除结果'''
multiply_divide_result = None
for i, num in enumerate(multiply_divide_value_list):
match = math_legal(num)
if match == True:
if multiply_divide_result:
if multiply_divide_operator_list[i - 1] == "*":
multiply_divide_result *= float(num)
elif multiply_divide_operator_list[i - 1] == "/":
try:
multiply_divide_result /= float(num)
except ZeroDivisionError as diag:
multiply_divide_result = 0
print("\33[33;0m输入的公式中存在除数为0,重新输入!\33[0m")
else:
multiply_divide_result = float(num)
else:
print("\33[33;0m输入的公式中存在无法识别的内容!\33[0m")
print("\33[33;0m尝试为您运算: %s\33[0m" % num)
num = re.sub("\D", "", num)
if num == "": num = 1
if multiply_divide_result:
if multiply_divide_operator_list[i - 1] == "*":
multiply_divide_result *= float(num)
elif multiply_divide_operator_list[i - 1] == "/":
multiply_divide_result /= float(num)
else:
try:
multiply_divide_result = float(num)
except ValueError as diag:
print("\33[33;1m无效输入!\33[0m")
return multiply_divide_result
def calculating_priority_formulas(priority_formula): #计算圆括号表达式
""""""
plusminus_operator_list, plusminus_expression_list = match_calc_formula(priority_formula)
print("-----------")
print("\33[31;1m步骤\33[0m")
print(plusminus_operator_list, plusminus_expression_list)
for index, equations in enumerate(plusminus_expression_list):
if "*" in equations or "/" in equations:
""""""
multiply_divide_operator_list, multiply_divide_value_list = matching_multiply_divide_operator(equations)
multiply_divide_result = multiply_divide_calc(multiply_divide_operator_list, multiply_divide_value_list) #取出乘除表达式进行乘除运算
plusminus_expression_list[index] = multiply_divide_result
plus_minus_result = plus_minus_calc(plusminus_operator_list, plusminus_expression_list) #将乘除的结果进行加减运算
print("%s 运算结果: %s" % (priority_formula, plus_minus_result))
return plus_minus_result def start_operation(formula):
""" 运算主程序入口,对输入的数学公式进行处理,匹配最底层圆括号表达式,并交给乘除函数计算返回结果,替换圆括号表达式"""
formula = formula.replace(" ", "") #去掉表达式多余的空格
formula = calc_formula(formula) #去掉表达式里重复的"+-"号
print(formula)
parenthesises_flag = True
while parenthesises_flag:
formula = calc_formula(formula)
parenthesis_formula = re.search(r"\(([^()]+)\)", formula)
if parenthesis_formula:
parenthesis_formula = parenthesis_formula.group()
parenthesis_calc_result = calculating_priority_formulas(parenthesis_formula)
formula = formula.replace(parenthesis_formula, str(parenthesis_calc_result))
print("parenthesis_calc_result: %s" % formula)
else:
calc_result = calculating_priority_formulas(formula)
parenthesises_flag = False
print("最后的运算结果: \33[31;1m%s\33[0m" % calc_result) def myCalcMain():
prompt = '''
请输入你的计算公式, 计算器会将计算结果输出到屏幕上(此处会打印步骤); 退出(exit/quit)
示例公式: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
'''
print(prompt)
while True:
formula = input("MyCalc> ").strip()
if formula == "exit" or formula == "quit":
print('欢迎下次使用,欢迎关注作者博客!(https://cnblogs.com/rianley)更多资讯敬请期待')
time.sleep(3)
exit("Bye.Bye...")
elif formula == "":
continue
else:
start_operation(formula)
if __name__ == '__main__':
myCalcMain()

  

结言

努力成为想要成为的人,就算最后失败了!也没关系,因为遗憾比失败可怕的多!

Python科学计算器(计算器)的更多相关文章

  1. windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等

    安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...

  2. Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)

    用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought ...

  3. 目前比较流行的Python科学计算发行版

    经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...

  4. Python科学计算之Pandas

    Reference: http://mp.weixin.qq.com/s?src=3&timestamp=1474979163&ver=1&signature=wnZn1UtW ...

  5. Python 科学计算-介绍

    Python 科学计算 作者 J.R. Johansson (robert@riken.jp) http://dml.riken.jp/~rob/ 最新版本的 IPython notebook 课程文 ...

  6. Python科学计算库

    Python科学计算库 一.numpy库和matplotlib库的学习 (1)numpy库介绍:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成 ...

  7. Python科学计算基础包-Numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能: 快速高效的多维数组对象ndarray. 用于对数组执行元素级计算以及直接对数 ...

  8. Python科学计算PDF

    Python科学计算(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VYs9BamMhCnu4rfN6TG5bg 提取码:2zzk 复制这段内容后打开百度网盘手机A ...

  9. python 科学计算及数据可视化

    第一步:利用python,画散点图. 第二步:需要用到的库有numpy,matplotlib的子库matplotlib.pyplot numpy(Numerical Python extensions ...

  10. Python科学计算结果的存储与读取

    Python科学计算结果的存储与读取 总结于2019年3月17日  荆楚理工学院 计算机工程学院 一.前言 显然,作为一名工科僧,执行科学计算,需用Python.PS:快忘记Matlab吧.我用了二十 ...

随机推荐

  1. hdu 6216 A Cubic number and A Cubic Number【数学题】

    hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...

  2. 使用JQuery做一组复选框的功能。

    之前做过复选框的功能,奈何笔记丢失,害的我又鼓捣了一番...还是博客园做笔记比较好. 假设现在有一个表格,每一行都有一个复选框按钮.在表头还有一个全选的复选框按钮. ①.当点击一个全选按钮时,下面的同 ...

  3. Oracle创建自增序列

    Oracle没有自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 先建一个测试表了: create table userlogin( id   number(6 ...

  4. 虚拟机Centos安装docker小记

    本书记录是参考 <Spring Cloud 与 Docker 微服务架构实战(第二版)>这本书实现的. 记录简单几个命令,安装顺序如下: 1. 安装docker所需的包 sudo yum ...

  5. 关于iframe里的子页面如何调取父级页面里的事件(子调父)

    在子页面里面的事件里写 self.parent.window.父级函数名('参数名'); 父级里面直接写函数. js中的parent.top.self的含义. js中经常看到window.parent ...

  6. 使用腾讯云mysql的一下小坑

    1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...

  7. MVC学习十三:RouteDebugger插件应用

    1.下载第三方程序集RouteDebugger https://files.cnblogs.com/files/WarBlog/RouteDebugger.rar 2.把RouteDebugger程序 ...

  8. PAT——1013. 数素数

    令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN的所有素数 ...

  9. NSLog的各种打印格式符 和 打印CGRect时用NSStringFromCGRect

    打印CGRect时用NSStringFromCGRect 转载自:http://blog.csdn.net/chenyong05314/article/details/8219270 1. 打印CG开 ...

  10. Java并发编程(一)为什么要并发

    并发所带来的好处 1. 并发在某些情况(并不是所有情况)下可以带来性能上的提升 1) 提升对CPU的使用效率 提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论 ...