python实现计算器功能的小练习

#知识点梳理
    # 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算
    # 利用循环实现多个数相乘或相除
    # 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。
    # 考核 正则表达式的运用
        # \d+(\.\d+)?[*/]-?\d+(\.\d+)?   乘除法
        # [+-]?\d+(?:\.\d+)?             加减法
        # \([^()]+\)                     括号
    # re模块的应用-----将字符串转为 列表
        # re.findall()    re.search()   roup()
    # 字符串的操作
        # replace   split
#知识点梳理
    # 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算
    # 利用循环实现多个数相乘或相除
    # 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。
    # 考核 正则表达式的运用
        # \d+(\.\d+)?[*/]-?\d+(\.\d+)?   乘除法
        # [+-]?\d+(?:\.\d+)?             加减法
        # \([^()]+\)                     括号
    # re模块的应用-----将字符串转为 列表
        # re.findall()    re.search()   roup()
    # 字符串的操作
        # replace   split

import re

def factorial_ts(exp):        # 定义阶乘算法
    if exp == 0 or exp == 1:
        return 1
    else:
        return exp * factorial_ts(exp-1)

def power_ts(exp_1,exp_2):              # 定义n次方
    if exp_2 == 0:
        return 1
    elif exp_2 == 1:
       return exp_1
    else:
        return exp_1 * power_ts(exp_1,exp_2-1)


def atom_cal(exp):
    if '*' in exp:       #计算单个的乘法
        a,b = exp.split('*')
        return str(float(a) * float(b))
    elif '/' in exp:  #计算单个的除法
        a, b = exp.split('/')
        return str(float(a) / float(b))

def format_exp(exp):  #处理符号的问题
    exp = exp.replace('--','+')
    exp = exp.replace('+-','-')
    exp = exp.replace('-+','-')
    exp = exp.replace('++','+')
    return exp

def mul_div(exp):    #计算乘除法
    while True:
        ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)  #利用正则表达式匹配乘或除法
        if ret:   #如果匹配到的话
            atom_exp = ret.group()  #将这个值拿出来
            res = atom_cal(atom_exp) #调用上面个的atom_cal计算
            exp = exp.replace(atom_exp,res) #将计算的结果把原来的算是替换掉
        else:return exp   #如果匹配不到的话说明乘除法计算完毕,返回计算结果

def add_sub(exp):  #计算加减法
    ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)  #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表
    exp_sum = 0
    for i in ret:
        exp_sum += float(i)   #将列表中的每一项求和
    return exp_sum


def factorial_exp(exp):                                     # 计算阶乘
    while True:
        exp_f = re.search('\d+(?:\.\d+)?!',exp) #       匹配符合阶乘形式的结果
        # print(info_f)
        if exp_f:
            info_f = exp_f.group()
            ret_f = factorial_ts(int(info_f[:-1]))  # 遍历匹配到的阶乘,将数字和运算号区分,并计算值
            # print(ret_f)
            exp = exp.replace(info_f, str(ret_f))  # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值
            # print(exp)
        else:return exp                         # 如果没有匹配到,则返回原值
# print(factorial_exp('5-3!-4!+5!+6'))

def power_exp(exp):
    while True:                       # 计算n次方
        info_p = re.search('\(-(?:\d+(?:\.\d+)?)\)\*\*\d+|\d+(?:\.\d+)?\*\*\d+',exp) # 匹配符合n次方形式的结果
        # print(info_p)
        if info_p:
            info_p = info_p.group()
            # print(info_p)
            exp_1, exp_2 = info_p.split('**')
            ret_p = power_ts(float(exp_1), int(exp_2))
            exp = exp.replace(info_p, str(ret_p))  # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值
            # print(exp)
        else:
            return exp  # 如果没有匹配到,则返回原值
# print(power_exp('2**4-3!-3**2+90/3/3'))

def cal(exp):    #计算加减乘除混合运算
    exp = factorial_exp(exp)
    exp = power_exp(exp)
    exp = mul_div(exp)  #调用mul_div函数先计算乘除法
    exp = format_exp(exp)  #调用format_exp处理计算时候的符号
    exp_sum =  add_sub(exp)  #调用add_sub计算加减法
    return exp_sum   # float  #返回计算结果

def c_input():
    str_fh = '+-*/!**.() '
    while True:
        info = input('请输入需要计算的数,输入完毕后按回车结束\n')
        i = 0
        while i <len(info):
            if info[i] not in str_fh and str.isdigit(info[i]) is False:
                print('您输入的数字和运算符号不合法')
                break
            i += 1
        if i == len(info):
            return info
# print(c_main())

def main():
    exp = c_input()
    # print(exp)
    exp = exp.replace(' ','')   #删除字符串中的空格
    # print(exp)
    while True:
        ret = re.search('\([^()]+\)',exp)  #匹配括号
        # print(ret)
        if ret :    #如果匹配到的话
            inner_bracket = ret.group() #用group()将匹配到的括号内容取出来
            # print(inner_bracket)
            res = str(cal(inner_bracket))  #调用cal()计算括号中的内容,将返回的结果转换成字符串
            # print(res)
            exp = exp.replace(inner_bracket,res)  #将匹配到的括号中的内容用计算结果替换
            # print(exp)
            exp = format_exp(exp)  #处理符号
            # print(exp)
        else:break  #直到没有括号跳出循环
    print(cal(exp))
    # return cal(exp)  #将剩下的内容进行计算,然后返回

if __name__ == '__main__':
    main()

部分内容参考:https://www.cnblogs.com/baijinshuo/p/9520320.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值