用python实现简单的计算器(加减乘除小括号等)
需求:实现能计算类似 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实现简单的计算器(加减乘除小括号等)的更多相关文章
- 教学项目之-通过Python实现简单的计算器
教学项目之-通过Python实现简单的计算器 计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/ ...
- python实现简单的循环购物车小功能
python实现简单的循环购物车小功能 # -*- coding: utf-8 -*- __author__ = 'hujianli' shopping = [ ("iphone6s&quo ...
- python实现简单的计算器功能
如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...
- javascript小括号、中括号、大括号学习总结
作为一名编程人员,和括号打交道是必不可少的.你可知道在不同的上下文中,括号的作用是不一样的,今天就让我们简单总结下javascript小括号.中括号.大括号的用法. 总的来说,JavaScript中小 ...
- 用python的正则表达式实现简单的计算器功能
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import re def welcome_func(): ""&q ...
- 用Python编写简单的发红包程序和计算器原理
用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...
- JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。
编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...
- [原创]python之简单计算器(超详解,只有基本功能+-*/,还有括号处理)
不想看过程的话,直接看文章最后的正式源码 作业需求及分析: 流程图 https://www.processon.com/diagraming/580c5276e4b03c844a5a9716 初期感 ...
- 比较不熟的JavaScript点滴,慢慢前行,附带简单复杂化的php小计算器一份
interface.php <html> <head> <meta charset="utf-8" /> <title>这是一个简单 ...
随机推荐
- UVa 839 -- Not so Mobile(树的递归输入)
UVa 839 Not so Mobile(树的递归输入) 判断一个树状天平是否平衡,每个测试样例每行4个数 wl,dl,wr,dr,当wl*dl=wr*dr时,视为这个天平平衡,当wl或wr等于0是 ...
- hibernate必须的包下载以及各个包的作用
hibernate必须的包(点击下载) 对应的入门级代码例子(点击下载) hibernate3.jar hibernate核心包 commons-collections-2.1.1.jar 集合包 ...
- hive跑mapreduce报java.lang.RuntimeException: Error in configuring object
写于2016.7月 最近项目需要在hbase上做统计分析,在本机上装了hive,结果跑小批量数据sum时报错: hive> select count(*) from page_view; Tot ...
- 从pip+requirements.txt+virtualenv管理依赖到使用pipenv管理依赖-修改布署方式
背景: 已经使用pip+requirements.txt+virtualenv管理了项目一段时间,为了不要每次都 导出依赖(本地),安装依赖(服务器) 现在要使用pipenv来管理项目的依赖关系 思路 ...
- CSS3 长度单位
http://www.w3chtml.com/css3/units/length/vh.html https://www.html.cn/book/css/values/length/vh.htm . ...
- zabbix 4.0版本
Zabbix 4.0 最高版本是4.2 1.什么是zabbix及优缺点(对比cacti和nagios) zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速 ...
- eclipse 包含头文件出错
最近这段时间自己在写游戏的框架,在做的过程中遇到了一个问题:没办法#include <iostream>,在eclipse下F3也找不到对应的 iostream 文件, 最后在晚上找资料, ...
- tagged和untagged
tagged和untagged遵循以下五条原则 1. Tagged数据帧 Tagged数据帧 Untagged数据帧 Untagged数据帧 in out in out Tagged端口 原样 ...
- tensorflow各个版本的CUDA以及Cudnn版本对应关系
概述,需要注意以下几个问题: (1)NVIDIA的显卡驱动程序和CUDA完全是两个不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运 ...
- Synchronized底层优化(轻量级锁、偏向锁)(二)
一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...