使用13行Python代码实现四则运算计算器函数
原创的刷新行数记录的代码,从14行到13行,是一小步也是一大步!
支持带小括号,支持多个连续+-号,如-7.9/(-1.2-++--99.3/-4.44)*---(2998.654+-+-+-(+1.3-7.654/(-1.36-99.99)/-4.33213)*-2998.13-1.31)-7.423/(-1.4235-+99.53456/-4.4)
查看计算结果的方式为:print(calculator('str格式的算式'))
import re
def calculator(s):
def two_num_cal(s): # 给定str格式的两个数字(可能是整数或小数)组成的四则运算表达式,返回float型的计算结果
if re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(2)=='*': return float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(1))*float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(3))
elif re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(2)=='/': return float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(1))/float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(3))
elif re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(2)=='+': return float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(1))+float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(3))
elif re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(2)=='-': return float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(1))-float(re.search(r'([+-]?\d+(?:\.\d+)?)([*/+-])([+-]?\d+(?:\.\d+)?)',s).group(3))
while not re.search(r'^[+-]?\d+(\.\d+)?$',s): # 当s不能转化为float型时,执行此while循环
while re.search('[+-]{2,}',s): s = s.replace('++', '+').replace('--', '+').replace('+-', '-').replace('-+', '-') # 循环替换表达式中多余的+-号
if re.search(r'[(][^()]+[)]', s): s = s[:re.search(r'[(][^()]+[)]', s).span()[0]] + str(calculator(re.search(r'[(][^()]+[)]', s).group()[1:len(re.search(r'[(][^()]+[)]', s).group())-1])) + s[re.search(r'[(][^()]+[)]', s).span()[1]:] # 匹配首个最内层小括号,递归计算其值,将结果替换至原字符串
if re.search(r'\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', s):s = s[:re.search(r'\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', s).span()[0]] + str(two_num_cal(re.search(r'\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', s).group())) + s[re.search(r'\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', s).span()[1]:] # 匹配首个乘法或除法,将结果替换至原字符串
if re.search(r'\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?', s)==None and re.search(r'[+-]?(\d+(\.\d+)?[+-]\d+(\.\d+)?)', s): s = s[:re.search(r'[+-]?(\d+(\.\d+)?[+-]\d+(\.\d+)?)', s).span()[0]] + str(two_num_cal(re.search(r'[+-]?(\d+(\.\d+)?[+-]\d+(\.\d+)?)', s).group())) + s[re.search(r'[+-]?(\d+(\.\d+)?[+-]\d+(\.\d+)?)', s).span()[1]:] # 匹配首个加法或减法,将结果替换至原字符串
return int(float(s)) if int(float(s))==float(s) else float(s)#如果结果能转化成int就输出int,否则输出float
使用13行Python代码实现四则运算计算器函数的更多相关文章
- 一个 11 行 Python 代码实现的神经网络
一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...
- 200行Python代码实现2048
200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面 ...
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- 15行python代码,帮你理解令牌桶算法
本文转载自: http://www.tuicool.com/articles/aEBNRnU 在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法 ...
- 30行Python代码实现人脸检测
参考OpenCV自带的例子,30行Python代码实现人脸检测,不得不说,Python这个语言的优势太明显了,几乎把所有复杂的细节都屏蔽了,虽然效率较差,不过在调用OpenCV的模块时,因为模块都是C ...
- 21行python代码实现拼写检查器
引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供很好的拼写检查,比方你输入 speling,谷歌会立即返回 spelling. 前几天,看到http://norvig.com/spe ...
- vim中凝视多行python代码
在vim中凝视多行python代码比較麻烦,主要由下面几种方法: (1)将须要凝视的代码以文档字符串的形式呈现 (2)将须要凝视的代码以函数的形式呈现 (3)使用vim自身快捷键 我们主要使用第三种方 ...
- 几行python代码解决相关词联想
日常生活中经常会遇到相关词联想的问题,也就是说输入一个词汇,把相关的词汇查询出来,听起来这个做法也不是太难,但如何去积累那么多的词汇,再用好的算法将相关内容联系起来,本身还是不简单的.笔者认为最简单的 ...
- 10 行 Python 代码实现模糊查询/智能提示
10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的 ...
随机推荐
- Codeforces A. Serval and Bus
inputstandard inputoutputstandard outputIt is raining heavily. But this is the first day for Serval, ...
- C#中如何将字符串或者字符串数组写入文本文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [lua]紫猫lua教程-命令宝典-L1-01-06. 循环结构
L1[循环]01. for循环结构介绍 只是简单的说了下计数型的for循环结构 for i=1,10,1 do testlib.traceprint(i) end 注意几点: 1.上面的1和10表示循 ...
- 寒假安卓app开发学习记录(4)
今天的任务第一个项目运行并部署.没想到第一个环节就出现了错误,运行之后eclipse报错:Errors occurred during the build.Errors running builder ...
- 单选按钮 设置required属性无法进行非空验证
先看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Linux下系统版本查询命令
# uname -a (Linux查看版本当前操作系统内核信息) # cat /proc/version (Linux查看当前操作系统版本信息) # cat /etc/issue 或 cat /etc ...
- 前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)
摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开 ...
- NTP网络授时服务器部署及网络时钟同步设置说明
NTP网络授时服务器部署及网络时钟同步设置说明 NTP网络授时服务器部署及网络时钟同步设置说明 本文由安徽京准科技提供@请勿转载. 一.前言 1.NTP简介 NTP是网络时间协议(Network T ...
- SQL Server不同服务器不同数据库间的操作
什么是跨服务器操作? 跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库上进行相关的数据库操作,比如增删改查. 为什么要进行跨服务器操作 随着数据量的增多,业务量的扩张,需要在不 ...
- MAC记住 git的用户名密码
问题:第一次使用MAC的git垃取代码时,连续输错密码.以为垃取不下来,就让同事用它的git账号和密码垃取了一次拉去成功了.之后我再配置git的用户名和密码设置称自己的.往后每次拉去和提交都显示同事的 ...