Python练习:实现通过直接输入字符串格式的算式来进行计算,支持加、减、乘、除、开方的运算,效果类似eval()函数。

文章介绍了一个Python代码示例,该示例自定义了一个函数用于解析和计算包含加减乘除及括号的算式,通过识别数字和运算符,模拟计算优先级来得出结果。这个函数可以作为eval()函数的一个替代,增加了对计算过程的控制和安全性。

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

Python的内置eval()函数:

print(eval(f"3+{pow(5,3)}"))#pow()函数用于计算5的3次方
print(eval(f"3+5*3"))
结果:
128
18

我的代码:

def cul(fuc):
    #接收算式
    a = fuc
    #添加代表结束的标识符
    a += '$'
    b = []
    c = []
    for i in a:
        #判断是数字还是计算符号,这里可以用re正则表达式来进行替代
        try:
            if (type(float(i))) == float:
                c.append(i)
        except:
            b.append(c)
            b.append(i)
            c = []
    #消除末尾的”$“
    b.pop()
    n = 0
    cul = 0
    # 这段代码用于判断计算的优先度,开方>乘除>加减。
    def fuc(n, cul2):
        try:
            p = b[n + 1]
        except:return n,cul2
        if p == '*' or p== '/' or p=="^":
            n += 2
            c = ''
            l = 0
            while l < len(b[n]):
                j = b[n][l]
                l += 1
                c += j
            if p == "*":
                cul2 *= float(c)
            elif p == "/":
                cul2 /= float(c)
            else:
                cul2 **= float(c)
            n, cul2=fuc(n,cul2)
        return n,cul2
    #开始计算
    #先取b的长度,防止取到范围外的值
    while n < len(b):
        c = ''
        i = b[n]
        m = 0
        #同上,这里判断b中每一部分的长度
        while m < len(i):
            j = i[m]
            m += 1
            c += j
            #使用try来防止因为例如float(“*”)的情况导致报错退出
            try:
                cul = float(c)
            except:
                c = ''
                n += 1
                l = 0
                #开始判断数字后的计算符号的类型,这里也可以改成上面fuc()的样子,用函数来减少代码量
                if j == '+':
                    while l < len(b[n]):
                        j = b[n][l]
                        l += 1
                        c += j
                    cul2 = float(c)
                    n,cul2=fuc(n,cul2)
                    cul += cul2
                elif j == '*':
                    while l < len(b[n]):
                        j = b[n][l]
                        l += 1
                        c += j
                    cul2 = float(c)
                    n,cul2=fuc(n,cul2)
                    cul *= cul2
                elif j == '/':
                    while l < len(b[n]):
                        j = b[n][l]
                        l += 1
                        c += j
                    cul2 = float(c)
                    n,cul2=fuc(n,cul2)
                    cul /= cul2
                elif j == '-':
                    while l < len(b[n]):
                        j = b[n][l]
                        l += 1
                        c += j
                    cul2 = float(c)
                    n,cul2=fuc(n,cul2)
                    cul -= cul2
                else:
                    print('error')
                    break
        n += 1
    print(a.replace('$', ''), '=', cul)

运行与对比:

1.

2.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TYMLISY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值