基于python实现的计算器

 

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
#"""

  

posted @ 2015-12-10 22:30  杰希  阅读(1709)  评论(0编辑  收藏  举报