python实现最简单的计算器功能源码
import re def calc(formula):
formula = re.sub(' ', '', formula)
formula_ret = 0
match_brackets = re.search(r'\([^()]+\)', formula)
if match_brackets:
calc_result = calc(match_brackets.group().strip("(,)"))
formula = formula.replace(match_brackets.group(), str(calc_result))
return calc(formula)
else:
formula = formula.replace('--', '+').replace('++', '+').replace('-+', '-').replace('+-', '-')
while re.findall(r"[*/]", formula):
get_formula = re.search(r"[.\d]+[*/]+[-]?[.\d]+", formula)
if get_formula:
get_formula_str = get_formula.group()
if get_formula_str.count("*"):
formula_list = get_formula_str.split("*")
ret = float(formula_list[0]) * float(formula_list[1])
else:
formula_list = get_formula_str.split("/")
ret = float(formula_list[0]) / float(formula_list[1])
formula = formula.replace(get_formula_str, str(ret)).replace('--', '+').replace('++', '+')
formula = re.findall(r'[-]?[.\d]+', formula)
for num in formula:
formula_ret += float(num)
return formula_ret
# calc_str = input('>>>')
calc_str = '1-2*((60-30+(-40---5)*(9-2*5/3+7/3*99/4*2998+ 10*568/ 14))-(-4*3)/(16-3*2))'
print(eval(calc_str))
formula_result = calc(calc_str)
print(formula_result)
带基本验证
import re
invalid_str_re = re.compile(r'[*/]{3,}|[%]{2,}|\([*/%]+\d+|^[*/%]+\d+|\(+\)+|\d+[-+*/%]+$|\)+\(+|\d+[-+*/%]+\)|\d+\(+') def decorate(func):
def wrapper(formula):
formula = re.sub(' ', '', formula)
valid_str = re.findall(r'[-+*/%.()\d]+', formula)
invalid_str = invalid_str_re.findall(formula)
if (valid_str and len(valid_str[0]) != len(formula)) or invalid_str:
return False
return func(formula)
return wrapper @decorate
def calc(formula):
formula = re.sub(' ', '', formula)
formula_ret = 0
match_brackets = re.search(r'\([^()]+\)', formula)
if match_brackets:
calc_result = calc(match_brackets.group().strip("(,)"))
formula = formula.replace(match_brackets.group(), str(calc_result))
return calc(formula)
else:
formula = formula.replace('--', '+').replace('++', '+').replace('-+', '-').replace('+-', '-')
while re.findall(r"[*/]", formula):
get_formula = re.search(r"[.\d]+[*/]+[-]?[.\d]+", formula)
if get_formula:
get_formula_str = get_formula.group()
if get_formula_str.count("*"):
formula_list = get_formula_str.split("*")
ret = float(formula_list[0]) * float(formula_list[1])
else:
formula_list = get_formula_str.split("/")
ret = float(formula_list[0]) / float(formula_list[1])
formula = formula.replace(get_formula_str, str(ret)).replace('--', '+').replace('++', '+')
formula = re.findall(r'[-]?[.\d]+', formula)
for num in formula:
formula_ret += float(num)
return formula_ret
# calc_str = input('>>>')
calc_str = '1-2*((60-30+(-40---5)*(9-2*5/3+7/3*99/4*2998+ 10*568/ 14))-(-4*3)/(16-3*2))'
formula_result = calc(calc_str)
print(formula_result)
python实现最简单的计算器功能源码的更多相关文章
- 出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码)
出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码) 购买后可提供相应的小修改,以及教你使用往这个多列面里再加上按钮功能! 这套源码可作为工作使用,也可用为新手学习AI脚面 ...
- Python 设计一个简单的计算器
设计目标 实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2 ...
- 微信跳转外部浏览器打开指定H5链接的功能源码
通常大家在微信内转发分享H5链接的时候都很容易碰到H5链接在微信内无法打开或在微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要 ...
- 构建NetCore应用框架之实战篇(七):BitAdminCore框架登录功能源码解读
本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.简介 1.登录功能完成后,框架的雏形已经形成,有必要进行复习. 2 ...
- 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码
本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...
- elasticsearch index 功能源码概述
从本篇开始,对elasticsearch的介绍将进入数据功能部分(index),这一部分包括索引的创建,管理,数据索引及搜索等相关功能.对于这一部分的介绍,首先对各个功能模块的分析,然后详细分析数据索 ...
- HashMap核心功能源码浅析
1.引子 "HashMap"由“hash”和“map"两个单词组成,这里的”map"表示“映射”而不是“地图”的意思,两个单词连起来就是“哈希映射表”.Map是 ...
- ios自动滚动图片功能源码
源码AdScrollerView,一个已经封装好的UIScrollView的子类,可以自动滚动图片以及对应的描述语,类似淘宝app首页的广告滚动效果.滚动图片数量不限,并且显示pageControl. ...
- .net 邮件批量发送功能源码
#define debug using System; using System.Text; using System.Linq; using System.IO; using System.Ne ...
随机推荐
- python 模块包裹
arlenmbx@arlenmbx-ThinkPad-X130e:~$ su root 密码: root@arlenmbx-ThinkPad-X130e:/home/arlenmbx# python ...
- ORA-00257: archiver error. Connect internal only, until freed.
早上BA抄送客户的邮件过来,说系统用不了,应用系统报异常Unable to open connection to oracle,Microsoft Provider v2.0.50727.42,既然是 ...
- shell语法
基本语法列表 #linux组成:内核+工具 #linux启动: . getty:提示登录名和密码,输入之后调用login . login:login验证用户名和密码,然后调用shell . shell ...
- Zookeeper开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- 安装JBOSS
下载JBOSS 无需安装 修改环境变量: JBOSS_HOME=/root/jboss-as-7.1.1.Finalexport JBOSS_HOME 进入bin下 ./standalone.sh - ...
- lua相关笔记
--[[ xpcall( 调用函数, 错误捕获函数 ); lua提供了xpcall来捕获异常 xpcall接受两个参数:调用函数.错误处理函数. 当错误发生时,Lua会在栈释放以前调用错误处理函数,因 ...
- HTML5 的一些小的整理吧
主要的就是一些HTML 5 API 的使用 也是借鉴别人的博客 ,和MDN(中文部分的还是能看的懂) 上面的一些东西 具体的代码在 有道云笔记里面也有. 先把总得列出来 1.Canvas绘图 学完这个 ...
- 非旋treap模板
bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...
- centos7.0 安装redis集群
生产环境下redis基本上都是用的集群,毕竟单机版随时都可能挂掉,风险太大.这里我就来搭建一个基本的redis集群,功能够用但是还需要完善,当然如果有钱可以去阿里云买云数据库Redis版的,那个还是很 ...
- ubuntu下设置数据库字符集
就linux环境下出现的数据库乱码的问题,以ubuntu为例进行的总结 ubuntu环境设置的字符集utf8,windows默认字符集是GBK,Ubuntu的默认字符集为utf-8,这使 得在用tel ...