基于python实现的计算器,,1.运用到的知识点 


1.运用到的知识点

  1.python正则表达式的应用,re.search(‘pattern‘,str).group()

  2.函数中递归的使用

  3.python函数、基本语法、控制语句if ...else ...、for循环语句的使用

  4,字符串的格式化、字符串的拼接

  5,列表的使用

  6.while True:statement 死循环的使用

2.代码

#!/usr/bin/env python# -*- coding:utf-8 -*-import re#处理乘除def compute_mul_div(arg):    #这里需要传入1个arg列表    value = arg[0]    #print value    #mch = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*]‘,value)    #对字符串进行乘除匹配:如1+2*3-3,就匹配:2*3    mch = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value)    #没匹配到就直接返回    if not mch:        return    #将匹配到的内容保存在content中    content = re.search(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value).group()    #print content    #对匹配到的内容进行*、/判断,然后进行相应的计算,如2*3,先分割后计算    if len(content.split(‘*‘))>1:        n1,n2 = content.split(‘*‘)        get_value = float(n1) * float(n2)    else:        n1,n2 = content.split(‘/‘)        get_value = float(n1) / float(n2)    #取出匹配内容两头的内容:before,after    before,after = re.split(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,value,1)    #然后拼接成新的字符串    new_str = "%s%s%s" %(before,get_value,after)    #把new_str赋值到arg[0]中    arg[0] = new_str    #再递归进行乘除计算    compute_mul_div(arg)#compute_mul_div(["1+2*3-4",0])#print compute_mul_div([])#处理加减def compute_add_sub(arg):    #arg = ["3+4-2--4++2",0]    #对传进来的arg[0]表达式进行第1次处理,将表达式中的++\--变成+,+-、-+变成-,处理完成以后就直接break    while True:        if arg[0].__contains__(‘--‘) or arg[0].__contains__(‘+-‘) or arg[0].__contains__(‘--‘) or arg[0].__contains__(‘-+‘):            arg[0] = arg[0].replace(‘--‘,‘+‘)            arg[0] = arg[0].replace(‘+-‘,‘-‘)            arg[0] = arg[0].replace(‘-+‘,‘-‘)            arg[0] = arg[0].replace(‘--‘,‘+‘)        else:            break    #然后对传进来的arg[0]表达式进行第2次处理,提取首位为“-”,并将提取的次数保存在arg[1]中    #并且没提取1次:将表达式中的"+"替换成"-"."-"替换成"+",然后取arg[0]表达式字符串中第1到最后1位即可赋给arg[0]    if arg[0].startswith(‘-‘):        arg[1]+=1        arg[0] = arg[0].replace(‘-‘,‘&‘)        arg[0] = arg[0].replace(‘+‘,‘-‘)        arg[0] = arg[0].replace(‘&‘,‘+‘)        arg[0] = arg[0][1:]    value = arg[0]    #对字符串value进行匹配,匹配加或减两边的内容,如1+2-3,就匹配1+2    mch = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value)    #如果没匹配到就直接发回    if not mch:        return    #将匹配的内容保存在content中,如1+2    content = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value).group()    #对匹配的内容进行计算:先进行判断+、-,判断后进行分割,分割后在针对+、-进行计算    if len(content.split(‘+‘))>1:        n1,n2 =content.split(‘+‘)        get_value = float(n1)+float(n2)    else:        n1,n2 =content.split(‘-‘)        get_value = float(n1)-float(n2)    #取出匹配内容两头的内容,封装在before,after中    before,after = re.split(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,str(value),1)    #before = re.split(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value,1)[0]    #after = re.split(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘,value,1)[1]    #将计算后的:before+结果+after,进行拼接,    new_str = "%s%s%s" %(before,get_value,after)    #再把拼接后的字符串赋值到arg[0]中,然后再递归进行计算    arg[0] = new_str    compute_add_sub(arg)#compute_add_sub(["1+3-2",0])#计算取出来的表达式#"""def compute(expr):    #先将表达式封装在inp列表中,列表的第一个元素表示:待处理表达式,第二个元素代表在表达式中首位为-号,然后我们进行提取的次数    inp = [expr,0]    #先进行乘除运算    compute_mul_div(inp)    #再进行加减运算    compute_add_sub(inp)    #判断inp[1]是奇数还是偶数,若是奇数,表明结果为负数,否则为正数    count = divmod(inp[1],2)    result = float(inp[0])    if count[1] == 1:        result = result * (-1)    return result#执行取出表达式def excute(expr):    #匹配最里层的括号,如:1+2*(3/(3-2)*2),这里匹配的是(3-2)    #若没括号了 直接返回表达式    if not re.search(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expr):        return expr    #用正则表达式取出最里括号的内容,并去掉2边的括号,得到新的表达式:content    content = re.search(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expr).group()    #只取字符串中第1个到倒数第二个之间的内容,即取去掉两侧的括号。如"(2+3)"只取2+3,不取两边的括号    new_content = content[1:len(content)-1]    ##将expr按匹配的内容进行分割:得到--before,匹配内容,after,得到content两侧的内容,并赋值给before,after    new_list = re.split(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expr)    before = new_list[0]    after = new_list[2]    #before,nothing,after = re.split(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘,expr)    #将new_content进行计算,计算得到result    result = compute(new_content)    #将before+result+after进行拼接,得到new_expr    new_expr = "%s%s%s" %(before,result,after)    #最终返回,递归执行excute(new_expr)    return excute(new_expr)#主函数if __name__ == "__main__":    #将带计算的表达式中的所包含的空格先去掉,得到没有空格的表达式    str1 = "4*3-10*(3*2-1*9/3)  +10"    no_space_str = re.sub(‘\s*‘,‘‘,str1)    #执行括号处理函数,取出优先计算或处理的内层表达式    ret = excute(no_space_str)    #inp = [ret,0]    #然后对取出来的内层表达式进行计算:包括先处理乘除后处理加减    final = compute(ret)    #打印最终计算的值    print final#"""

  

基于python实现的计算器

相关内容

    暂无相关文章

评论关闭