禁用eval,并且输入的是字符串类型,如何使用python编写一个 计算器

本文介绍了一个不使用eval命令的手写简易计算器程序,该程序能够处理包含括号、加减乘除及小数点的数学表达式。通过逐步解析并计算表达式中的乘除法和加减法,最终得到正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:禁止使用eval命令,让用户输入字符串,实现加减乘除加上括号的运算:

下面是自己写的代码:

# -*- coding:utf-8 -*-
import re
def jia_jian_cheng_chu(s):
    m1_g = [ re.search('[+\-]?\d+\.?\d*[*/]\-?\d+\.?\d*', s).group() if re.search('[+\-]?\d+\.?\d*[*/]\-?\d+\.?\d*', s) else 0]
    m2_g=[ re.search('[+\-]?\d+\.?\d*[+\-]\d+\.?\d*', s).group() if re.search('[+\-]?\d+\.?\d*[+\-]\d+\.?\d*', s) else 0]
    if m1_g[0] !=0:
        v = re.split('[*/]', m1_g[0])
        result = [float(v[0]) * float(v[1]) if "*" in m1_g[0] else float(v[0]) / float(v[1])]
        result = '+' + str(result[0])
        s = s.replace(m1_g[0], result, 1).replace('+-', '-').replace('-+', '-').replace('--', '+').replace(
            '++', '+')
        return jia_jian_cheng_chu(s)
    elif m2_g[0] !=0:
        v=m2_g[0].replace('-','+-').lstrip('+').split('+')
        result=float(v[0]) + float(v[1])
        s=s.replace(m2_g[0],str(result),1).replace('+-', '-').replace('-+', '-').replace('--', '+').replace(
            '++', '+')
        return jia_jian_cheng_chu(s)
    else:
        return s
def bracket(bra):
    bra=bra.replace(' ','')
    ret=[jia_jian_cheng_chu(re.search('\([^()]*\)',bra).group().strip('()')) if re.search('\([^()]*\)',bra) else 0]
    if ret[0] != 0:
        bra=bra.replace(re.search('\([^()]*\)',bra).group(),ret[0],1)
        bra=bra.replace('+-','-').replace('--','+').replace('--','+').replace('++','+')
        return bracket(bra)
    else:
        ret=jia_jian_cheng_chu(bra)
        return ret
def main():
    while True:
        expression = input('请输入您的表达式或者退出(b),只能含有数字,()和小数点以及加减乘除:').strip().replace(' ', '')
        if expression.lower() == 'b': break
        if re.search('[^0-9\.+\-*/()]', expression) or re.search('[+\-*/][+\-*/]', expression):
            print('表达式错误')
        else:
            print('结果为: ')
            print(bracket(expression))

if __name__ == '__main__':
    main()
其实:一个运算可以切分为两类,有括号的和没有括号的

有括号的提取里面的东西,还要注意里面不能有括号,然后是乘除法优先级高于加减


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值