实现功能:计算带有括号和四则运算的式子 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)

基本思路:使用正则表达式提取出每一层小括号式子,计算出结果后替换该括号,直至最后一层。

0、计算前的准备,进行式子的整理,如果非法则退出。这里我只对空格和符号进行了处理,真实场景中应该做更多的判断:

def check(s):

s = s.replace(" ", '')

s = re.sub(r'(\+-)|(-\+)', '-', s)

s = re.sub(r'(\+\+)|(--)', '+', s)

return s

1、只有加减运算的式子:findall匹配后直接使用sum函数对list求和,此时的减号看作负号,加号看作了正号,所以代码极其简洁:

import re

def plus_all(s): #实现加减运算

patter_plus = r'[+-]?\d+\.?\d*'

ret = re.findall(patter_plus, s)

return sum([float(x) for x in ret])

2、只有乘除运算的式子:和以上思路一致,主要想把除法(/)转换为乘法后用reduce计算。其先匹配出带有乘除运算符的list,然后通过change_mul_div()函数将除法转换成倒数计算

from functools import reduce

def mul_all(s):

patter_mul = r'[*/]?[-]?\d+\.?\d*'

ret = re.findall(patter_mul, s)

return reduce(lambda m, n: m*n, [change_mul_div(x) for x in ret])

def change_mul_div(s):

if "/" in s:

return 1 / float(s.replace('/', ""))

else:

return float(s.replace("*", ''))

3、含有加减乘除但不含有括号的式子:先用mul_all(s)函数将式子中的所有乘除法计算完毕,然后回到第1步。cal_all_mul_div函数实现计算式子中所有乘除法:

def cal_all_mul_div(s):

patter_all_mul_div = r'([+-]?\d+\.?\d*[*/])+[+-]?\d+\.?\d*'

ret = re.search(patter_all_mul_div, s)

while ret:

mul_div = mul_all(ret.group())

s = s.replace(ret.group(), ''.join(['+', str(mul_div)]))

ret = re.search(patter_all_mul_div, s)

return s

4、不断提取括号进行计算:

def bracket(s):

patter_kuohao = r'\([^()]+\)'

ret = re.search(patter_kuohao, s)

while ret:

cal_result = plus_all(cal_all_mul_div(ret.group()))

s=s.replace(ret.group(), ''.join(['+', str(cal_result)]))

ret = re.search(patter_kuohao, s)

return s

所有代码合并如下:

import re

from functools import reduce

s3 = "3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)"

def check(s):

s = s.replace(" ", '') #对空格进行处理

s = re.sub(r'(\+-)|(-\+)', '-', s) #对符号进行处理

s = re.sub(r'(\+\+)|(--)', '+', s)

return s

def plus_all(s):

patter_plus = r'[+-]?\d+\.?\d*'

ret = re.findall(patter_plus, s) #找出所有的加数

return sum([float(x) for x in ret]) #生成器生成列表并求和

def mul_all(s):

patter_mul = r'[*/]?[-+]?\d+\.?\d*'

ret = re.findall(patter_mul, s)

return reduce(lambda m, n: m * n, [change_mul_div(x) for x in ret]) #reduce连乘

def change_mul_div(s): #把除法改成乘以其倒数

if "/" in s:

return 1 / float(s.replace('/', ""))

else:

return float(s.replace("*", ''))

def cal_all_mul_div(s):

patter_all_mul_div = r'([+-]?\d+\.?\d*[*/])+[+-]?\d+\.?\d*'

ret = re.search(patter_all_mul_div, s)

while ret:

mul_div = mul_all(ret.group())

s = s.replace(ret.group(), ''.join(['+', str(mul_div)]))

ret = re.search(patter_all_mul_div, s)

return s

def bracket(s):

patter_kuohao = r'\([^()]+\)'

s = check(s)

ret = re.search(patter_kuohao, s)

while ret:

cal_result = plus_all(cal_all_mul_div(ret.group()))

s = check(s.replace(ret.group(), ''.join(['+', str(cal_result)]))) #替换时需要在前面加入正号,并对s进行check操作

ret = re.search(patter_kuohao, s)

return s

s3 = ''.join(["(", s3, ")"])

print(float(bracket(s3)))

以上即用不超过50行代码实现了计算器的主要功能。

python实现50行代码_50行代码实现python计算器主要功能相关推荐

  1. 50行的python游戏代码_50行代码实现贪吃蛇(具体思路及代码)

    [下载文档:  50行代码实现贪吃蛇(具体思路及代码).txt ] (友情提示:右键点上行txt文档名->目标另存为) 50行代码实现贪吃蛇(具体思路及代码) 最近一直在准备用来面试的几个小de ...

  2. 闭关备战python面试50天,“啃完”这份python面试宝典,我终于四面拿下阿里offer

    写在开篇 闲话(长话短说): 本篇文章主要是回忆去年下半年的面试总结.现已入职阿里4个月的时间,终于有时间写下这篇python面经. 去年的一整年各地都在陆陆续续受到疫情的干扰,疫情的缘故对我们的生活 ...

  3. C++比Python快50倍?如何让C++和Python优势互补?(Boost::Python)

    目录 1 为什么需要多语言联合编程? 2 Python调用C++的主要方式 2.1 SWIG 2.2 Boost::Python 2.3 ctypes 3 Boost::Python安装 4 测试实例 ...

  4. 50行的python游戏代码_50行Python代码写一个语言检测器

    你有没有曾经好奇过Chrome浏览器是如何知道一个网页的语言,并对外国文字的网页提供翻译服务的?或者,Facebook是如何翻译你朋友用写在你主页上的外国文字?检测一种语言实际上非常简单,改进了用户体 ...

  5. python实现50行代码_50行Python代码,教你获取公众号全部文章

    > 本文首发自公众号:python3xxx 爬取公众号的方式常见的有两种 - 通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章 - 通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自 ...

  6. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  7. python心得体会200字_50行代码让python自动生成文章

    不知道从小到大,我们被迫写了多少心得体会,多少人生感想,如果真情实地的去感受写作然后成长当然很好,但是更多的都是形式主义的需求,并没有人去看里面的内容,白白浪费我们多少大好时光,有时候我们ctrl,C ...

  8. python英语小词典代码_50 行代码,实现中英文翻译

    原标题:50 行代码,实现中英文翻译 源 /痴海文 /痴海 现在的时代,越来越看重英语能力.如果你懂得英语,你会接触到更大的世界,你会发现更多的信息.尤其是对于程序员来说,好的编程资料都是来自英文文档 ...

  9. python50行小游戏_50行python代码实现的贪吃蛇小游戏

    50行python代码实现的贪吃蛇小游戏 发布于 2014-09-01 21:26:24 | 1337 次阅读 | 评论: 1 | 来源: 网友投递 Python编程语言Python 是一种面向对象. ...

最新文章

  1. webdriver For selenium
  2. HTTP Error 503. The service is unavailable.
  3. P3804-[模板]后缀自动机【SAM】
  4. 使用 Redis 实现 Session 共享
  5. 突发!5G 标准推迟三个月
  6. 现在,Echo不仅会说话,还学会了变魔术
  7. 利用rowid删除数据,提升性能
  8. python isinstance()方法的使用
  9. coreos(coreos介绍)
  10. c语言输出数组时输出的乱七八糟
  11. 你的系统可靠性和可用性是几个9?
  12. java脚本引擎parseint方法_autojs脚本引擎调用java的jsoup爬取科学网博客的指定id的好友名字...
  13. java登陆密码加密怎么做,Java如何实现密码加密
  14. Spring事务管理理解
  15. 区块链防守铁娘子和她的安全军团
  16. 超级产品:喜茶,凭什么能估值90亿
  17. 读书笔记:SAFNet
  18. 前端运行项目清缓存等小技巧
  19. PHP基础语法,学习完直接上手
  20. 姑苏拟秋裤邻近建楼房 摩天大楼泡沫隐现

热门文章

  1. Tensorflow GPU安装指南 (Ubuntu 16.04 anaconda cuda8.0 cuDNN6.0)
  2. leetcode 473. Matchsticks to Square | 473. 火柴拼正方形(递归)
  3. 面试必会系列 - 5.2 详解OSI模型与七层协议,网络TCP/IP基础,三次握手、四次挥手等
  4. P8实战(一):架构概论,从过去到未来
  5. 【GitHub】GitHub 的 Pull Request 和 GitLab 的 Merge Request 有区别吗?
  6. Kafka单机、集群模式安装详解(二)
  7. Linux 串口 gprs at,linux下GPRS模块使用AT命令实现拨接电话,发中英文短信
  8. 【四种解法】剑指 Offer 39. 数组中出现次数超过一半的数字
  9. 【测试点分析】1067 试密码 (20分)_20行代码AC
  10. 算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)