python开发Day05(计算器代码)

import re
def calculator(formula):#定义函数,参数为formula(传进来的公式)
    print(formula)  #输出传进来的参数
    a=''#定义一个空的变量字符串,为了将用户传进来的参数中有空格的去掉并重新给a变量公式
    for i in formula:#循环传进来的参数
        if i == ' ':#判断如果是空就continue进行下一次循环
            continue
        a=a+i#判断不成立就向a变量中添加当前循环的内容

    while True:#while循环,使用break退出或者整个函数结束
        b=re.search('\([^()]+\)',a)#取出传进来的参数中最里层的括号内容
        if b:#判断b是否成立,如果取出了括号是成立向下执行,否则执行函数panduan。
            c=b.group()#读取b变量的内容
            cc=c[1:-1]#使用切片去掉字符串两边的空格
            c2=panduan(formula_2=cc)#将去掉空格的字符串传给panduan函数使用c2变量接收返回值
            print(c2)#输出panduan执行后的返回值
            a=a.replace(c,c2[0])#将a变量中读取到的c变量内容也就是括号内的内容替换成panduan函数执行的返回值
            print(a)#输出修改后的内容
        else:#b变量不满足判断
            c2=panduan(formula_2=a)#不满足的情况下就是没有括号了所以继续执行panduan函数将返回值给c2
            return c2[0]#panduan函数执行完毕后将内容返回并且使用索引取出格式为字符串
def panduan(formula_2):#定义函数panduan,formula_2参数是将公式内最里层的括号内容。
    a=re.split('[*/+-]',formula_2)#将传进来的参数按照*/+-切割。
    b=re.findall('[*/+-]',formula_2)#在传进来的参数中找到*/+-
    print(a,b)#输出切割和找到的内容
    for k,i in enumerate(a):#循环输出切割出来的内容并加上序号从0开始
        if len(i) == 0:#判断这次循环的内容总长度是0
            a[k+1] = b[k]+a[k+1]#将切割后内容索引为k+1的改成b变量中k的索引和a变量中k+1的索引,因为如果i是空的那么就代表着这个数是一个负数
            del a[k]#删除当前a变量中对应的k索引
            del b[k]#删除当前b变量中对应的索引
    print(a,b)#输出当前a变量和b变量
    abc=chengchu(formula_3=a,yunsuanfu=b)#在上一层循环结束后也就是将负数都恢复加上负号将当前切割后的a变量和b变量传给乘除函数,使用abc变量来接收乘除函数的返回值
    return abc#返回abc变量内容
def chengchu(formula_3,yunsuanfu):#定义一个函数chengchu,参数formula_3用于接收panduan函数执行后的数值,yunsuanfu参数是panduan函数中b变量也就是索引的运算符号
    a=True#定义一个变量为True
    while a:#while不断的循环
        for k,i in enumerate(yunsuanfu):#for循环取运算符并且加上每一个的索引位置
            if i == '*' or i == '/':#判断当前循环i的值是*或者/
                print(formula_3[k],formula_3[k+1])#输出*或者/对应索引的formula_3列表中数值和当前索引加1的数值
                if i == '*':#判断本次循环的i是*
                    b=float(formula_3[k])*float(formula_3[k+1])#定义b变量使用formula_3加上本次循环索引的位置    乘    formula_3本次索引位置的+1,并且将其都转换成浮点类型
                    print('=======>',formula_3[k],'*',formula_3[k+1])#输出上一步的操作
                    formula_3[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_3列表中本次循环索引位置为b
                    del formula_3[k+1]#删除本次循环索引加1对应的formula_3列表的值
                    del yunsuanfu[k]#删除本次循环索引对应的yunsuanfu列表中的值,因为此值是使用过的不需要再出现
                    print(formula_3,yunsuanfu)#输出当前formula_3列表和yunsuanfu列表
                    break#退出本次循环,因为如果他继续循环循环formula_3,yunsuanfu这两个列表的时候会报错,因为索引长度超出了列表的长度
                else:#判断如果不是*那就是/
                    b=float(formula_3[k])/float(formula_3[k+1])#定义b变量使用formula_3加上本次循环索引的位置    除    formula_3本次索引位置的+1,并且将其都转换成浮点类型
                    print('+++++++>',formula_3[k],'/',formula_3[k+1])#输出上一步的操作
                    formula_3[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_3列表中本次循环索引位置为b
                    del formula_3[k+1]#删除本次循环索引加1对应的formula_3列表的值
                    del yunsuanfu[k]#删除本次循环索引对应的yunsuanfu列表中的值,因为此值是使用过的不需要再出现
                    print(formula_3,yunsuanfu)#输出当前formula_3列表和yunsuanfu列表
                    break#退出本次循环,因为如果他继续循环循环formula_3,yunsuanfu这两个列表的时候会报错,因为索引长度超出了列表的长度
        else:#循环完成了,在yunsuanfu列表中没有了*/
            a=False#定义a变量为False停止while循环
            if len(yunsuanfu) == 0:#判断当前的yunsunafu列表的长度是不是0,也就是说没有运算符了
                return formula_3#返回计算后的结果
            else:#当前的yunsuanfu列表中还有那么可能就是+或者-了
                a=jiajian(formula_4=formula_3,yunsuanfu_2=yunsuanfu)#执行jiajian函数并且将当前计算完成的*和/结果传给他和当前xunhuanfu变量的列表,使用变量a来接收返回值
                return a#返回a变量内容
def jiajian(formula_4,yunsuanfu_2):#定义一个函数jiajian,参数formula_4用于接收chengchu函数执行后的数值,yunsuanfu_2参数是chenghchu函数中执行完成后yunsuanfu变量剩余的内容
    a=True#定义一个变量为True
    while a:#while不断的循环
        for k,i in enumerate(yunsuanfu_2):#for循环取运算符并且加上每一个的索引位置
            if i == '+' or i == '-':#判断当前循环i的值是+或者-
                print(formula_4[k],formula_4[k+1])#输出+或者-对应索引的formula_4列表中数值和当前索引加1的数值
                if i == '+':#判断本次循环的i是+
                    b=float(formula_4[k])+float(formula_4[k+1])#定义b变量使用formula_4加上本次循环索引的位置    加    formula_4本次索引位置的+1,并且将其都转换成浮点类型
                    print('=======>',formula_4[k],'+',formula_4[k+1])#输出上一步的操作
                    formula_4[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_4列表中本次循环索引位置为b
                    del formula_4[k+1]#删除本次循环索引加1对应的formula_4列表的值
                    del yunsuanfu_2[k]#删除本次循环索引对应的yunsuanfu_2列表中的值,因为此值是使用过的不需要再出现
                    print(formula_4,yunsuanfu_2)#输出当前formula_4列表和yunsuanfu_2列表
                    break#退出本次循环,因为如果他继续循环循环formula_4,yunsuanfu_2这两个列表的时候会报错,因为索引长度超出了列表的长度
                else:#不是+就是-
                    b=float(formula_4[k])-float(formula_4[k+1])#定义b变量使用formula_4加上本次循环索引的位置    减    formula_4本次索引位置的+1,并且将其都转换成浮点类型
                    print('+++++++>',formula_4[k],'-',formula_4[k+1])#输出上一步的操作
                    formula_4[k] = str(b)#在上面计算完成后的b变量数值传换成字符串格式,然后修改formula_4列表中本次循环索引位置为b
                    del formula_4[k+1]#删除本次循环索引加1对应的formula_4列表的值
                    del yunsuanfu_2[k]#删除本次循环索引对应的yunsuanfu_2列表中的值,因为此值是使用过的不需要再出现
                    print(formula_4,yunsuanfu_2)#输出当前formula_4列表和yunsuanfu_2列表
                    break#退出本次循环,因为如果他继续循环循环formula_4,yunsuanfu_2这两个列表的时候会报错,因为索引长度超出了列表的长度
        else:#循环完成了,在yunsuanfu列表中没有了+-
            a=False#定义a变量为False停止while循环
            #if len(yunsuanfu_2) == 0:#判断当前的yunsunafu列表的长度是不是0,也就是说没有运算符了
            return formula_4#返回计算后的结果
            #else:#如果yunsuanfu列表中还有那就是*/但是不可能......
            #    a=chengchu(formula_3=formula_4,yunsuanfu=yunsuanfu_2)
            #    return a#返回a变量内容
result=calculator("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) ")#执行函数calculator并且将运算的数值传给他的参数
print(result)#输出函数calculator执行结果

 

posted @ 2016-05-23 16:53  WuYongQi。  阅读(250)  评论(0编辑  收藏  举报