在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)
可以看出经过改进后的求解函数比原来计算速度更快。
需要注意的是
- 输入时,保证输入字符串中括号的使用是合法的。
- 对电阻取并时要能够表述清楚需要取并的电阻,如2k//2k+1k,如果没有小括号,程序会理解为2k//3k,因此需要表述为(2k//2k)+1k,这样才能保证原来的含义 。
- 程序仅经过了一定数量的测试,不能完全保证计算结果的绝对无误,使用本程序造成任何后果概不负责。
- 未经许可,禁止转载。