Python实现多电阻并联快捷计算

本文介绍了一种使用Python实现的多电阻并联计算方法。该方法支持大数值简化输入及括号优先级运算,通过递归优化提高了计算效率。

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

在Python中实现对多电阻并联表达式的便捷计算

最近做模电作业和实验时使用手机计算器计算感觉很不流畅,然后转向Python后发现尽管定义了电阻并联计算,但还是不太满意,尤其是遇到多个电阻并联的表达式时,会有很多组括号需要嵌套,使用不便。另外还有,经常遇到如20k等大电阻时,不想输入多个0来进行换算。
针对以上这些问题,设计了一个能够简单快捷的计算多组电阻并联表达式的函数,并支持输入‘k‘来代替‘×1000’。
计算时需要定义如’(200k * 0.184 + 20k)//20k//(200+101*100)'格式的字符串,调用定义好的solve()函数可对字符串格式并联表达式进行计算。
以上是上篇文章实现的内容,但是不难发现,上次的solve()求解函数仅仅支持对顺序优先级的表达式进行计算,这是不能接受的,因此,在之前solve()函数的基础上进行改进,将其定义为solve0(),并增加了按优先级计算部分的代码,未调用其他数据结构,仅在原生的Python环境中使用list设计了新的表达式求解函数solve()。
为了使程序更加简洁,并进一步优化算法的时间复杂度,使用了递归方法,设计了求解函数solve2()

当前两个求解函数,可以支持对具有不同优先级的含有多组括号的分式表达式进行计算如:
s = '(81*(3k//3k))/(1k+81*(3k//3k))'
print(solve(s))
#或者
#print(solve2(s))

程序:

#两电阻并联计算
def B(r1,r2):
    return (r1*r2) / (r1+r2)
    
#实现对简单字符串表达式的计算
#输入为如'(200k * 0.184 + 20k)//20k//(200+101*100)'格式的无优先级(括号)字符串
def solve0(s):
    s1 = s.replace('k','*1000')
    list_s = s1.split('//')
    list_val = []
    for item in list_s:
        list_val.append(eval(item))
    if len(list_val) == 1:
        res = list_val[0]
    else:
        for i in range(len(list_val)-1):
            if i == 0:
                res = list_val[0]
            res = B(res,list_val[i+1])
    return res
   
#提取字符串s第一组括号中的内容
#如果没有括号返回原字符串
def get_con(s):
    if s.find('(') == -1:
        return s
    cnt = 0
    f_idx = -1
    flag = 1
    for i in range(len(s)):
        if s[i] == '(':
            cnt+=1
            if flag == 1:
                f_idx = i
                flag = 0
        elif s[i] == ')':
            cnt-=1
        if cnt == 0 and f_idx != -1:
            e_idx = i
            break
    return s[f_idx+1:e_idx]

#按优先级由高到低依次向外计算
def solve(s):
    flag = 1
    while s.find('(') != -1:
        if flag == 1:
            st = s
        st = get_con(st)
        if st.find('(') == -1:
            tmp = solve0(st)
            flag = 1
        else:
            flag = 0
            continue
        st2 = s.replace('(' + st + ')',str(tmp))
        if s != st2:
            s = st2
        else:
            s = solve0(s)
    return solve0(s)

#优化后使用递归方法实现优先级由高到低计算
def solve2(top_s):
    now_s = get_con(top_s)
    if top_s == now_s:
        return solve0(top_s)
    return solve2(top_s.replace('(' + now_s + ')',str(solve2(now_s))))

示例:

在这里插入图片描述

测试对比:

import time

tic = time.time()
print(solve(s)) #初始方法
print(time.time()-tic)

tic = time.time()
print(solve2(s))#递归方法
print(time.time()-tic)

在这里插入图片描述
可以看出经过改进后的求解函数比原来计算速度更快。

需要注意的是
  1. 输入时,保证输入字符串中括号的使用是合法的。
  2. 对电阻取并时要能够表述清楚需要取并的电阻,如2k//2k+1k,如果没有小括号,程序会理解为2k//3k,因此需要表述为(2k//2k)+1k,这样才能保证原来的含义 。
  3. 程序仅经过了一定数量的测试,不能完全保证计算结果的绝对无误,使用本程序造成任何后果概不负责。
  4. 未经许可,禁止转载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值