小编写这篇文章的主要目的,主要是给大家介绍一下,关于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.cloudads.cn/archives/3948.html