概述
Author :君安(Junan) Create On:2022年6月11日
本文章仅仅针对于加减乘除(四则运算),其他可自行更改
- 前言
- 代码实现
- 实现原理
- 参数说明
前言:
本文章为原创文章,不存在搬运行为。为什么要做这个?eval不好吗?eval当然好,但是,他有限制性,如果你要别的效果,eval显然不行。所以,作者做了一个仿eval的函数。取名为evaled。
代码实现:
下面我们来看看代码
def evaled(exp): def sub(exp): try: list=[] i=0 while i<len(exp): n='' if exp[i] in '0123456789.': while exp[i] in '0123456789.': n+=exp[i] i+=1 else: n=exp[i] i+=1 list.append(n) return list except: list.append(n) return list exp=sub(exp) string=[] while '(' in exp: for i in range(len(exp)): try: if exp[i]=='(': start=i string=[] elif exp[i]==')': s=[] for j in range(len(exp)): if j<start or j>i: s.append(exp[j]) else: if j==start: s.append(str(evaled(string))) exp=s else: string.append(exp[i]) except: break for i in range(len(exp)): try: if exp[i]=='-': if i>0: try: exp[i-1]=str(float(exp[i-1])) except: exp[i]=None exp[i+1]='-'+exp[i+1] else: exp[i]=None exp[i+1]='-'+exp[i+1] if exp[i]=='+': if i>0: try: exp[i-1]=str(float(exp[i-1])) except: exp[i]=None else: exp[i]=None except: continue while None in exp: exp.remove(None) new=[] for i in range(len(exp)): if exp[i]=='*' and exp[i-2]!='*' and exp[i-2]!='/' and exp[i-2]!='%': new.append('f'+exp[i-1]+'~'+exp[i+1]+'*') elif exp[i]=='/' and exp[i-2]!='*' and exp[i-2]!='/' and exp[i-2]!='%': new.append('f'+exp[i-1]+'~'+exp[i+1]+'/') elif exp[i]=='%' and exp[i-2]!='*' and exp[i-2]!='/' and exp[i-2]!='%': new.append('f'+exp[i-1]+'~'+exp[i+1]+'%') else: try: if exp[i-1]!='*' and exp[i-1]!='/' and exp[i+1]!='*' and exp[i+1]!='/'and exp[i-1]!='%' and exp[i+1]!='%': new.append(exp[i]) if exp[i]=='*' and (exp[i-2]=='*' or exp[i-2]=='/' or exp[i-2]=='%'): new.append(exp[i+1]) elif exp[i]=='/' and (exp[i-2]=='*' or exp[i-2]=='/' or exp[i-2]=='%'): new.append(exp[i+1]) elif exp[i]=='%' and (exp[i-2]=='*' or exp[i-2]=='/' or exp[i-2]=='%'): new.append(exp[i+1]) except: new.append(exp[i]) res=new[0] try: res=float(res) except: res=str(res) for i in range(0,len(new)): try: if new[i]=='+': if new[i+1][0]=='f': op=new[i+1][-1] a=new[i+1].split('~') a[0]=a[0][1:len(a[0]):1] a[1]=a[1][0:-1:1] if op=='*': new[i+1]=float(a[0])*float(a[1]) elif op=='/': new[i+1]=float(a[0])/float(a[1]) elif op=='%': new[i+1]=float(a[0])%float(a[1]) res=float(res)+float(new[i+1]) elif new[i]=='-': if new[i+1][0]=='f': op=new[i+1][-1] a=new[i+1].split('~') a[0]=a[0][1:len(a[0]):1] a[1]=a[1][0:-1:1] if op=='*': new[i+1]=float(a[0])*float(a[1]) elif op=='/': new[i+1]=float(a[0])/float(a[1]) elif op=='%': new[i+1]=float(a[0])%float(a[1]) res=res-float(new[i+1]) elif new[i]=='*' and len(new[i])==1: res=res*float(new[i+1]) elif new[i]=='/' and len(new[i])==1: res=res/float(new[i+1]) elif new[i]=='%' and len(new[i])==1: res=res%float(new[i+1]) else: try: op=new[i][-1] a=new[i].split('~') a[0]=a[0][1:len(a[0]):1] a[1]=a[1][0:-1:1] if op=='*': res=float(a[0])*float(a[1]) elif op=='/': res=float(a[0])/float(a[1]) elif op=='%': res=float(a[0])%float(a[1]) except: pass except: continue return res
实现原理:
检测到括号递归括号里的内容,检测一元(负)数,检测到乘法(或除法)进行改写(单个不改写)为f{num1}~{num2}*(或/),最后检测加减,并且计算改写后的乘法。
传参说明:
参数必须为一个字符串
例如:"-1*3"
得到结果为:-3
最后
以上就是无限百褶裙为你收集整理的Python四则运算(加减乘除,非eval函数)的全部内容,希望文章能够帮你解决Python四则运算(加减乘除,非eval函数)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复