python公式计算器_Python-计算器
#計(jì)算器開(kāi)發(fā)需求
#
#1、實(shí)現(xiàn)加減乘除及拓號(hào)優(yōu)先級(jí)解析
#2、用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式后,
#必須自己解析里面的(),+,-,*,/符號(hào)和公式,運(yùn)算后得出結(jié)果,結(jié)果必須與真實(shí)的計(jì)算器所得出的結(jié)果一致
import re
import functools
def minus_operator_handler(formula):
'''處理一些特殊的符號(hào)'''
minus_operator = re.split("-",formula)
calc_list = re.findall("[0-9]",formula)
if minus_operator[0] == '':#第一值肯定是負(fù)號(hào)
clac_list[0] = '-%s' % calc_list[0]
res = functools.reduce(lambda x,y:float(x) - float(y),calc_list)
print("\33[33;1m減號(hào)[%s]處理結(jié)果:\033[0m" % formula,res)
return res
def remove_duplicates(formula):
formula = formula.replace("++","+")
formula = formula.replace("+-","-")
formula = formula.replace("-+","-")
formula = formula.replace("--","+")
formula = formula.replace("- -","+")
return formula
def compute_mutiply_dividend(formula):
'''算乘除,傳進(jìn)來(lái)的是字符串'''
operators = re.findall("[*/]",formula)
calc_list = re.split("[*/]",formula)
res = None
for index,i in enumerate(calc_list):
if res:
if operators[index-1] == "*":
res *= float(i)
else operators[index-1] == "/"
res /= float(i)
else:
res = float(i)
print("\033[31;1m[%s]運(yùn)算結(jié)果=\033[0m" %formula, res)
return res
def handle_minus_in_list(operators_list,calc_list):
for index,i in enumerate(calc_list):
if i == '':#它其實(shí)代表負(fù)號(hào),改成負(fù)號(hào)
calc_list[index+1] = i + calc_list[index+1].strip()
def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
for index,i in enumerate(multiply_and_dividend):
i = i.strip()
if i.endswith("*") or i.endswith("/"):
multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
del multiply_and_dividend[index+1]
del plus_and_minus_operators[index]
return plus_and_minus_operators,multiply_and_dividend
def compute(formula):
'''這里計(jì)算的是不帶括號(hào)的公式'''
formula = formula.strip("()")#去除外面包的括號(hào)
formula = remove_duplicates(formula)#去除外重復(fù)的+-號(hào)
plus_and_minus_operators = re.findall("[+-]",formula)
multiply_and_dividend = re.split("[+-]",formula)#取出乘除公式
if len(multiply_and_dividend[0].strip()) == 0:#代表這肯定是個(gè)減號(hào)
multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
del multiply_and_dividend[0]
del plus_and_minus_operators[0]
plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
for index,i in enumerate(multiply_and_dividend):
if re.search("[*/]",i):
sub_res = compute_mutiply_dividend(i)
multiply_and_dividend[index] = sub_res
#開(kāi)始運(yùn)算+,-
print(multiply_and_dividend,plus_and_minus_operators)
total_res = None
for index,item in enumerate(multiply_and_dividend):
if total_res:#代表不是第一次循環(huán)
if plus_and_minus_operators[index-1] == '+':
total_res += float(item)
elif plus_and_minus_operators[index-1] == '-':
total_res -= float(item)
else:
total_res = float(item)
print("\033[32;1m[%s]運(yùn)算結(jié)果:\033[0m" %format,total_res)
return total_res
def calc(formula):
'''計(jì)算程序入口,主要邏輯是先計(jì)算括號(hào)里的值,算出來(lái)后再計(jì)算乘除,再算加減'''
parenthesise_flag = Ture
calc_res = None#初始化運(yùn)算結(jié)果為None
while parenthesise_flag:
m = re.search("\[^()*\]",formula)#找到最里層的括號(hào)
if m:
#print("先算括號(hào)里的值:",m.group())
sub_res = compute(m.group())
formula = formula.replace(m.group(),str(sub_res))
else:
print('\033[41;1m----沒(méi)括號(hào)了...---\033[0m')
print('\n\n033[42;1m最終結(jié)果:\033[0m',compute(formula))
parenthesise_flag = False#代表公式里的括號(hào)已經(jīng)都被剝除
if __name__ == '__main__':
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python公式计算器_Python-计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python制作聊天机器人原理_用 Py
- 下一篇: 字符串最长公共子序列python_求解两