python实现计算器
生活随笔
收集整理的這篇文章主要介紹了
python实现计算器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 import re
2 import functools
3
4
5 def minus_operator_handler(formula):
6 '''處理一些特殊的減號(hào)運(yùn)算'''
7 minus_operators = re.split("-",formula)
8 calc_list= re.findall("[0-9]",formula)
9 if minus_operators[0] == '': #第一值肯定是負(fù)號(hào)
10 calc_list[0] = '-%s' % calc_list[0]
11 res = functools.reduce(lambda x,y:float(x) - float(y), calc_list)
12 print("\033[33;1m減號(hào)[%s]處理結(jié)果:\033[0m" % formula, res )
13 return res
14
15 def remove_duplicates(formula):
16 formula = formula.replace("++","+")
17 formula = formula.replace("+-","-")
18 formula = formula.replace("-+","-")
19 formula = formula.replace("--","+")
20 formula = formula.replace("- -","+")
21 return formula
22 def compute_mutiply_and_dividend(formula):
23 '''算乘除,傳進(jìn)來的是字符串噢'''
24 operators = re.findall("[*/]", formula )
25 calc_list = re.split("[*/]", formula )
26 res = None
27 for index,i in enumerate(calc_list):
28 if res:
29 if operators[index-1] == "*":
30 res *= float(i)
31 elif operators[index-1] == "/":
32 res /= float(i)
33 else:
34 res = float(i)
35
36 print("\033[31;1m[%s]運(yùn)算結(jié)果=\033[0m" %formula, res )
37 return res
38 def handle_minus_in_list(operator_list,calc_list):
39 '''有的時(shí)候把算術(shù)符和值分開后,會(huì)出現(xiàn)這種情況 ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 ']
40 這需要把第2個(gè)列表中的空格都變成負(fù)號(hào)并與其后面的值拼起來,惡心死了
41 '''
42 for index,i in enumerate(calc_list):
43 if i == '': #它其實(shí)是代表負(fù)號(hào),改成負(fù)號(hào)
44 calc_list[index+1] = i + calc_list[index+1].strip()
45 def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
46 '''有時(shí)會(huì)出現(xiàn)這種情況 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面這段實(shí)際是 2*-14969036.7968254,需要特別處理下,太惡心了'''
47 for index,i in enumerate(multiply_and_dividend):
48 i = i.strip()
49 if i.endswith("*") or i.endswith("/"):
50 multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
51 del multiply_and_dividend[index+1]
52 del plus_and_minus_operators[index]
53 return plus_and_minus_operators,multiply_and_dividend
54 def compute(formula):
55 '''這里計(jì)算是的不帶括號(hào)的公式'''
56
57 formula = formula.strip("()") #去除外面包的拓號(hào)
58 formula = remove_duplicates(formula) #去除外重復(fù)的+-號(hào)
59 plus_and_minus_operators = re.findall("[+-]", formula)
60 multiply_and_dividend = re.split("[+-]", formula) #取出乘除公式
61 if len(multiply_and_dividend[0].strip()) == 0:#代表這肯定是個(gè)減號(hào)
62 multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
63 del multiply_and_dividend[0]
64 del plus_and_minus_operators[0]
65
66 plus_and_minus_operators,multiply_and_dividend=handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
67 for index,i in enumerate(multiply_and_dividend):
68 if re.search("[*/]" ,i):
69 sub_res = compute_mutiply_and_dividend(i)
70 multiply_and_dividend[index] = sub_res
71
72 #開始運(yùn)算+,-
73 print(multiply_and_dividend, plus_and_minus_operators)
74 total_res = None
75 for index,item in enumerate(multiply_and_dividend):
76 if total_res: #代表不是第一次循環(huán)
77 if plus_and_minus_operators[index-1] == '+':
78 total_res += float(item)
79 elif plus_and_minus_operators[index-1] == '-':
80 total_res -= float(item)
81 else:
82 total_res = float(item)
83 print("\033[32;1m[%s]運(yùn)算結(jié)果:\033[0m" %formula,total_res)
84 return total_res
85
86 def calc(formula):
87 '''計(jì)算程序主入口, 主要邏輯是先計(jì)算拓號(hào)里的值,算出來后再算乘除,再算加減'''
88 parenthesise_flag = True
89 calc_res = None #初始化運(yùn)算結(jié)果為None,還沒開始運(yùn)算呢,當(dāng)然為None啦
90 while parenthesise_flag:
91 m = re.search("\([^()]*\)", formula) #找到最里層的拓號(hào)
92 if m:
93 #print("先算拓號(hào)里的值:",m.group())
94 sub_res = compute(m.group())
95 formula = formula.replace(m.group(),str(sub_res))
96 else:
97 print('\033[41;1m----沒拓號(hào)了...---\033[0m')
98
99 print('\n\n\033[42;1m最終結(jié)果:\033[0m',compute(formula))
100 parenthesise_flag = False #代表公式里的拓號(hào)已經(jīng)都被剝除啦
101
102 if __name__ == '__main__':
103
104 #res = calc("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
105 res = calc("1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
?
轉(zhuǎn)載于:https://www.cnblogs.com/JerryZao/p/8681379.html
總結(jié)
以上是生活随笔為你收集整理的python实现计算器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试Open Live Writer
- 下一篇: C 冒泡排序及其非常非常非常简单的优化