小编写这篇文章的主要目的,主要是给大家介绍一下,关于Python中,四则表达式用法的一些实例,具体的代码操作,下面会给大家做出一个相关解答。
四则运算表达式求值
思路说明
使用双栈数据库来实现——存放数值的栈nums与存放运算符的栈ops.
算法步骤
对初始表达式字符串exp进行预处理,将其转为一个元素对应一个数值或运算符的列表explist.
遍历explist,每个元素依次压入对应的栈中.每次压入后,判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是,ops栈顶为<*>,</>之一,且nums中的元素比ops中的元素恰好多一个.如果可以运算,则运算,并将运算结果压回nums中.
explist遍历完之后,所有乘除运算都已进行,此时ops中只剩加法与减法,接下来开始另一个循环,一直运算即可.最后nums中剩余的唯一元素即为表达式的值.
代码
def operation(a,b,op:str): """ 计算一次运算的结果 :param a:val :param b:val :param op:运算符 :return:val """ if op=='+': return a+b elif op=='-': return a-b elif op=='*': return a*b elif op=='/': return a/b else: raise Exception('运算符不正确') def exp_str2list(exp:str): """ 将表达式exp:str转成list,每个元素对应一个数<num>或运算符<op>. 已知exp是标准的四则运算表达式字符串. :param exp:str,表达式 :return:list """ opset={'+','-','*','/'}#运算符集合 flag=-1 explist=list() for i,char in enumerate(exp):#对表达式字符串中的每个字符 if char in opset:#若char是运算符 explist.append(exp[flag+1:i])#上一个运算符到当前运算符中间为数字,保存到explist flag=i#更新flag到当前op位置 explist.append(char)#当前op亦加入explist explist.append(exp[flag+1:]) return explist def calculate_expression(exp:str): """ 表达式求值.计算字符串exp所代表的表达式的值,返回一个数值 已知exp是标准的四则运算表达式字符串,且不含括号. :param exp:str,表达式 :return:val """ opset={'+','-','*','/'} nums=list()#数栈 ops=list()#运算符栈 explist=exp_str2list(exp) print(explist) for e in explist: #e入栈 if e in opset:#若e是运算符 ops.append(e) else: nums.append(eval(e)) #若e是优先级高的乘除法,且 #nums与ops恰好匹配,栈顶可以进行一次计算,运算结果压入回nums if ops and ops[-1]in{'*','/'}and len(nums)==len(ops)+1: op=ops.pop() y=nums.pop() x=nums.pop() nums.append(operation(x,y,op)) #此时explist中元素已全部遍历,同时乘除法均已被运算,双栈只剩加减法有待运算.众所周知,加减法服从结合律,接下来一路算到底即可. while ops: op=ops.pop() y=nums.pop() x=nums.pop() x_op_y=operation(x,y,op) nums.append(x_op_y) return nums[0] if __name__=='__main__': exp='1*43+542+532*432' print(calculate_expression(exp)) print(eval(exp))
综上所述,上面就是小编给大家总结的关于Python中如何合理的运用四则表达式的相关介绍了,希望可以给各位读者带来帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/127811.html
摘要:获取怎样的数据在这里首先需要考虑,我们的四则运算计算器的计算复杂度是如何的是仅能计算两个数值的简单运算,如还是能进行混合四则运算,如那么你想处理运算的复杂程度就决定了你想获取怎样的数据,这是很实际的问题。 引言 在上一篇文章的介绍中,我们提及了Python的三种基本数据类型,如文章末尾所说,Python中的内建数据类型并不仅仅是这几种,但其实我从接触Python到现在,往往就是这几种简...
摘要:的符号运算如果之前是学数学相关专业了解计算机代数系统,就会对数学符号的运算比较熟悉,而如果之前是程序员,可能会有点不太明白,下面我们就来了解一下。 在我们初、高中和大学近10年的学习时间里,数学一直占据着非常大的分量,但是回忆过去可以发现,我们把大量的时间都花在反复解题、不断运算上,计算方法、运算技巧、笔算能力以及数学公式的记忆仿佛成了我们学习数学的全部。这些记忆和技巧没几年就忘掉了,...
摘要:方法的产生式如下由得这个函数,包含了除布尔值的表达式之外的,各个表示数据得表达式的解析部分。这里我的链接直接指向了上关于线性渐变的形式语法部分,可以看到这部分对线性渐变语法的描述,和我上面解析的时候所用的产生式如出一辙。 博客源地址:https://github.com/LeuisKen/l...相关评论还请到 issue 下。 方法说明 san.parseExpr是San中主模块下的...
摘要:最后实现的符号运算,符号与实数对四则运算封闭,符号与符号对加减封闭多么偷懒啊哈哈哈哈原谅我没文化上,知道了的通过单元测试要实现方法。 最后的效果: if __name__ == __main__: import doctest doctest.testmod() x = Symbols(x) print(x * 2 + 1 == 8.0 * x + 6)...
摘要:概述近期重新开始学习计算机基础方面的东西,比如计算机组成原理网络原理编译原理之类的东西,目前正好在学习编译原理,开始对这一块的东西感兴趣,但是理论的学习有点枯燥无味,决定换种方式,那就是先实践遇到问题尝试解决,用实践推动理论。 0x000 概述 近期重新开始学习计算机基础方面的东西,比如计算机组成原理、网络原理、编译原理之类的东西,目前正好在学习编译原理,开始对这一块的东西感兴趣,但是...
阅读 889·2023-01-14 11:38
阅读 833·2023-01-14 11:04
阅读 684·2023-01-14 10:48
阅读 1887·2023-01-14 10:34
阅读 891·2023-01-14 10:24
阅读 750·2023-01-14 10:18
阅读 479·2023-01-14 10:09
阅读 519·2023-01-14 10:02