栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python四则运算(加减乘除,非eval函数)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python四则运算(加减乘除,非eval函数)

Author :君安(Junan)     Create On:2022年6月11日

本文章仅仅针对于加减乘除(四则运算),其他可自行更改


  • 前言
  • 代码实现
  • 实现原理
  • 参数说明

前言:

    本文章为原创文章,不存在搬运行为。为什么要做这个?eval不好吗?eval当然好,但是,他有限制性,如果你要别的效果,eval显然不行。所以,作者做了一个仿eval的函数。取名为evaled。

代码实现:

  下面我们来看看代码

def evaled(exp):
    def sub(exp):
        try:
            list=[]
            i=0
            while ii:
                            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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号