需求:实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Xiaobai Lei
import re
def atom_cal(m_str):
"""最小计算单位"""
if "*" in m_str:
m1,m2 = m_str.split("*")
return str(float(m1) * float(m2))
elif "/" in m_str:
m1,m2 = m_str.split("/")
return str(float(m1)/float(m2)) def format_str(f_str):
"""格式化字符串"""
f_str = f_str.replace("++","+")
f_str = f_str.replace("+-","-")
f_str = f_str.replace("--","+")
f_str = f_str.replace("-+","-")
return f_str def mul_div(exp):
"""计算乘除"""
while True:
exp_res = re.search(r"\d+(\.\d+)?[*/]-?\d+(\.\d+)?", exp) # 找出乘除法的表达式
if exp_res:
atom_exp = exp_res.group() # group取出最小的表达式
res = atom_cal(atom_exp) # 计算最小单位乘除得到结果
exp = exp.replace(atom_exp, res) # 将结果替换回原来的字符串
else:
return str(exp) def add_sub(exp):
"""计算加减"""
exp_sum = 0
while True:
exp_res = re.findall(r"-?\d+(?:\.\d+)?", exp) # 用findall将符号连带数字一起找出来,直接相加就行了,这样还省去了去括号的麻烦,这个思想不错
if exp_res:
for i in exp_res:
exp_sum += float(i)
return exp_sum def cal(exp):
"""计算加减乘除并返回值"""
exp = mul_div(exp) # 先计算乘除
exp = format_str(exp) # 格式化字符串
exp = add_sub(exp) # 计算加减
return exp def main(exp):
exp = exp.replace(' ','') # 先去空格
while True:
exp_res = re.search(r"\([^()]+\)", exp) # 找括号
if exp_res:
exp_group = exp_res.group() # 取值
cal_res = cal(exp_group) #计算括号内的值,返回数值结果
exp = exp.replace(exp_group, str(cal_res)) # 在这里str转字符串而不是在返回值转是因为想最终返回给用户的计算值为float类型
else:
return cal(exp)
s = "1 +3*2/4- 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
print(eval(s)) # python计算出来的结果
print(main(s)) # 自己写的计算出来的结果
 

用python实现简单的计算器(加减乘除小括号等)的更多相关文章

  1. 教学项目之-通过Python实现简单的计算器

    教学项目之-通过Python实现简单的计算器   计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...

  2. python实现简单的循环购物车小功能

    python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s&quo ...

  3. python实现简单的计算器功能

    如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...

  4. javascript小括号、中括号、大括号学习总结

    作为一名编程人员,和括号打交道是必不可少的.你可知道在不同的上下文中,括号的作用是不一样的,今天就让我们简单总结下javascript小括号.中括号.大括号的用法. 总的来说,JavaScript中小 ...

  5. 用python的正则表达式实现简单的计算器功能

    #!/usr/bin/env python # -*- coding:utf-8 -*- import sys import re def welcome_func(): ""&q ...

  6. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  7. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  8. [原创]python之简单计算器(超详解,只有基本功能+-*/,还有括号处理)

     不想看过程的话,直接看文章最后的正式源码 作业需求及分析: 流程图 https://www.processon.com/diagraming/580c5276e4b03c844a5a9716 初期感 ...

  9. 比较不熟的JavaScript点滴,慢慢前行,附带简单复杂化的php小计算器一份

    interface.php <html> <head> <meta charset="utf-8" /> <title>这是一个简单 ...

随机推荐

  1. 浏览器端-W3School-Browser:Window 对象

    ylbtech-浏览器端-W3School-Browser:Window 对象 1.返回顶部 1. Window 对象 Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架 ...

  2. golang开发问题

    开发问题: How to find out which types implement which interface in Golang? How do you quickly find the i ...

  3. 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils

    不是没有事务造成的 这样相当于有四个connection 每一个都有自己独立的事物 每一个自己成功就提交事务. 已经提交的就执行结束.没有提交的就报异常 让这些操作使用同一个connection 事物 ...

  4. Oracle 数据字典视图(V$,GV$,X$)

    常用的几个数据字典: user_objects : 记录了用户的所有对象,包含表.索引.过程.视图等信息,以及创建时间,状态是否有效等信息,是非DBA用户的大本营.想知道自己有哪些对象,往这里查. u ...

  5. java:IO流(File,字节流/输入输出流(InputStream(FileInputStream),OutputStream(FileOutStream)),字符流(Reader,Writer))

    File: * java.io.File类:代表一个文件或目录. * 常用的构造方法: * File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例 ...

  6. centos7 系統vps安裝mysql5.6及設置本地遠程連接筆記

    用xshell連接上vps 1,下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm su ...

  7. cocos2dx基础篇(24) 场景切换效果CCTransitionScene

    [3.x]     (1)去掉 "CC"     (2)卡牌翻转 TransitionFlip 中的样式 tOrientation // //1: kCCTransitionOri ...

  8. python学习之数据类型(tuple)

    3.6 元组 v = (11,22,33,'asd','汉字') 元组就是不可变的列表,又叫制度列表,属性特征与字符串相似,里边可以存放任何类型的元素. 1.元组的元素 这里元组的不可变的意思是⼦元素 ...

  9. python基础语法之字符串

    1 字符串中*的使用 *可以使字符串重复n次 print('hello world ' * 2) # hello world hello world 2 索引获取字符串的字符元素 print('hel ...

  10. 【神经网络与深度学习】【Matlab开发】caffe-windows使能Matlab2015b接口

    [神经网络与深度学习][Matlab开发]caffe-windows使能Matlab2015b接口 标签:[神经网络与深度学习] [Matlab开发] 主要是想全部来一次,所以使能了Matlab的接口 ...