说明

该计算器主要是为了练习正则表达式以及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. 基于IDEA的JavaWeb开发环境搭建

    基于IDEA的JavaWeb开发环境搭建 基于IDEA的JavaWeb开发环境搭建 jdk下载安装配置环境变量 下载 安装 配置环境变量 下载安装激活使用IntelliJ IDEA 下载 安装 激活 ...

  2. phonegap 捕获图片,音频,视屏 api capture

    一. capture Api 简单介绍 capture 对象用于获取视屏,音频和图像,它是一个全局对象,通过 navigator.device.capture 来访问 方法: capture.capt ...

  3. html style标签

    <div id="d1">或者<div class="d1">在css下定义id的函数前缀是#,定义class前缀是.css代码就可以这 ...

  4. JSON解析问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/quanqinayng/article/details/25121955 这是data.chatFil ...

  5. PHP------Jquery的用法

    Jquery Jquery实际上相当于一个升级版的JS,Jquery里面封装了很多的东西,Jquery的功能要比JS强大,用起来比JS方便.Jquery和JS都属于JS,只不过Jquery是封装了一个 ...

  6. Exhaustive Search

    Write a program which reads a sequence A of n elements and an integer M, and outputs "yes" ...

  7. Redis通过IO进行序列化+反序列化

    必须引用序列化Serializable接口 创建类:Role package com.wbg.springRedis.entity; import java.io.Serializable; publ ...

  8. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  9. NSString,NSData,NSFileManager常用方法

    一.利用NSString类进行文件路径的处理 文件路径格式: NSString *path=@"/Uesrs/apple/testfile.txt" 常用方法汇总: 1.获得组成此 ...

  10. HttpClient请求地址并携带参数

    废话不多,直接上代码! /** * * @param httpUrl * @param reqInfo * @return */ public static StringBuffer sendPost ...