Python 70行代码实现简单算式计算器

描述:用户输入一系列算式字符串,程序返回计算结果。

要求:不使用eval、exec函数。

实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘除运算。对于加减乘除,也要确立一个优先级,可以使用一个运算符列表,用for循环逐个处理运算符,并且要考虑同级情况(如for遍历至*时,也要考虑同级别的\是否要提前运算)。不断循环上述过程,直到最终得到一个结果。

关键点:使用re模块匹配出当前状态下优先级最高的算式。

result = re.search(‘\([^()]+\)‘,s)

实现代码:

import re
‘‘‘根据本逻辑,‘-’必须早于‘+’循环 否则特殊情况会报错
	原因是若出现符号--,会被处理为+,若+优先遍历,最后+将无法被处理‘‘‘
oper_char = [‘^‘,‘*‘,‘/‘,‘-‘,‘+‘]
def format_str(s):
    ‘‘‘除去空格和两边括号‘‘‘
    return s.replace(‘ ‘,‘‘).replace(‘(‘,‘‘).replace(‘)‘,‘‘)

def handle_symbol(s):
    ‘‘‘处理多个运算符并列的情况‘‘‘
    return s.replace(‘+-‘,‘-‘).replace(‘--‘,‘+‘).replace(‘-+‘,‘-‘).replace(‘++‘,‘+‘)

def cal(x,y,opertor):
    ‘‘‘加减乘除开方‘‘‘
    if opertor == ‘^‘:return x**y
    elif opertor == ‘*‘:return x*y
    elif opertor == ‘/‘:return x/y
    elif opertor == ‘+‘:return x+y
    elif opertor == ‘-‘:return x-y

def Bottom_operation(s):
    ‘‘‘无括号运算  返回一个浮点数
		symbol用于判断返回值是正还是负‘‘‘
    symbol = 0
    s = handle_symbol(s)
    for c in oper_char:
        while c in s:
            id,char = (s.find(c),c)
            if c in (‘*‘,‘/‘) and ‘*‘ in s and ‘/‘ in s:
                ids,idd = (s.find(‘*‘),s.find(‘/‘))
                id,char = (ids,‘*‘) if ids <= idd else (idd,‘/‘)
            if c in (‘+‘,‘-‘) and ‘+‘ in s and ‘-‘ in s:
                ida,idd = (s.find(‘+‘),s.find(‘-‘))
                id,char = (ida,‘+‘) if ida <= idd else (idd,‘-‘)
            if id == -1:break
            left,right = (‘‘,‘‘)
            for i in range(id - 1,-1,-1):
                if s[i] in oper_char:break
                left = s[i] + left
            for i in range(id + 1,len(s)):
			 if s[id+1] == ‘-‘:
			     right += s[i]
				continue
                if s[i] in oper_char:break
                right += s[i]
            if right == ‘‘ or left == ‘‘:
                if s[0] in (‘-‘,‘+‘):
                    if ‘+‘ not in s[1:] and ‘-‘ not in s[1:]:break
                    s = s[1:].replace(‘-‘,‘负‘).replace(‘+‘,‘-‘).replace(‘负‘,‘+‘)
                    symbol += 1
                    continue
                else:return ‘输入算式有误‘
            old_str = left + char + right
            new_str = str(cal(float(left),float(right),char))
            s = handle_symbol(s.replace(old_str,new_str))
    return float(s) if symbol % 2 == 0 else -float(s)

def get_bottom(s):
    ‘‘‘获取优先级最高的表达式‘‘‘
    res = re.search(‘\([^()]+\)‘,s)
    if res != None:return res.group()

if __name__ == ‘__main__‘:
    while True:
        s1 = input(‘请输入您要计算的表达式(支持加减乘除开方): ‘)
        while get_bottom(s1) != None:
            source = get_bottom(s1)
            result = Bottom_operation(format_str((source)))
            s1 = s1.replace(source,str(result))
        print(Bottom_operation(format_str(s1)))

原文地址:https://www.cnblogs.com/lazyfish007/p/11434366.html

时间: 2024-10-12 09:05:29

Python 70行代码实现简单算式计算器的相关文章

Python实现3行代码解简单的一元一次方程

Python实现3行代码解简单的一元一次方程 class Solution(object): def exec(self, equation): vars = None eqList = list(equation) denth = 0 for i,each in enumerate(equation): if each in "abcdefghijklmnopqrstuvwxyz": vars = each if i == 0: continue if equation[i-1] i

Python 50行代码实现代理服务器(加强版)

网上很多python 50行代码实现代理服务器,但是易出现异常,导致退出. 这里的代理服务器,是指二级代理服务器.比如:A可以访问B,B可以访问C,A不能直接访问C.这时,如果在B开一个二级代理,就可实现A访问C.现有的工具有CCProxy. 这里就是使用Python简单的实现一个二级代理. #coding=utf-8 import socket import select import sys import threading import time import logging import

HTML5游戏实战之70行代码实现经典游戏《伐木工》

伐木工游戏大家都玩过,今天介绍它在TangIDE上的实现方式,大概70行左右代码. 这个版本的伐木工,是为麦当劳定制的,放了一些麦当劳的一些产品. 先show一下最终的成果,您可以点这里玩,或者手机扫描二维码: 当然如果您想在线编辑此游戏,点这里. 在开始介绍游戏开发步骤前,先打个广告,对html5游戏开发,TangIDE 或者Cantk 感兴趣的朋友请扫描下方二维码,加入七巧板官方QQ交流群,一起交流做html5游戏的乐趣,群主正是Cantk作者李先静老师. 相信经过一段时间的训练,每天做1-

微信自动回复,Python几行代码就搞定了,消息不在错过

之前写过一篇python-requests获取好友列表的文章,简直花费了好多的时间和精力,又抓包,又找参数,又分析的,简直麻烦透顶,今天突然知道了另外一种捷径,几行代码就可以完成.... 学习Python中有不明白推荐加入交流裙                                           号:735934841                                           群里有志同道合的小伙伴,互帮互助,                     

100行代码实现简单目录浏览器制作

给大家分享使用Lae软件开发工具开发小应用程序的过程,希望大家喜欢! 界面部分我们用lae软件开发工具实现,无需写代码,业务逻辑部分使用Lae软件开发平台自带的LuaIDE编辑器,使用100行lua代码完成简单目录浏览器的制作. lae软件下载地址: https://github.com/ouloba/laetool.git lae软件下载地址(国内):https://pan.baidu.com/s/1ckMy0Q 相关视频: http://www.tudou.com/listplay/aly7

jquery轮播图详解,40行代码即可简单解决。

我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jquery其实真的很简单,只要不停的练习就会有很大进步.每天150行代码,会帮助我们走的更远.对于编程对于脚本语言,我们这样的学生娃没有和比人一样初中,高中就开始研究,要想走在时代的前沿需要怎样的努力和毅力,是我们一类人需要思考的方向. 下面解释下焦点图,焦点图使用范围非常广,banner和anima

python多行代码简化

python中,可以把多行代码简化为一行,把for循环和if条件判断都集中到一行里来写,示例如下: >>> from nltk.corpus import stopwords >>> english_stopwords = stopwords.words('english')#加载nltk中的英文停用词数据#创建一个列表,内含3个单词列表 >>> texts_tokenized = [['writing', 'ii', 'rhetorical', 'c

GameBuilder开发游戏应用系列之70行代码实现套圆环

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-551421721381542 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-551421721381542 微信扫描: 运行截图: 套圆环是火舞上的一款非常火爆的游戏,它是FlappyBird的变种,也是重力感应类的游戏,不同的是碰撞检测从FlappyBird的钢管,变成中间的一根绳子. 这根绳子在Game

词云制作没那么难,Python 10 行代码就实现了!

写在前面 想必大家有一个问题.什么是词云呢? 词云又叫名字云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.. 网页上有许多词云的效果图: 而且,目前有许多制作词云的工具: 但是作为一个学习Python的程序员来说,我更喜欢通过自己的编程去解决问题. 而且用Python制作词云只需十行代码就行了哦~ 一起来看看吧! 代码块 import matplotlib.pyplot as plt fr