Python計算器實操

2022-05-04 06:45:07 字數 3001 閱讀 9563

開發乙個簡單的python計算器  

實現加減乘除及拓號優先順序解析

使用者輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式

後,必須自己解析裡面的(),+,-,*,/符號和公式(不能呼叫eval等類似功能偷懶實現),運算後得出結果,結果必須與真實的計

算器所得出的結果一致。

import re

def chengchu(num):

'''乘除操作'''

while re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num): #當有*/運算時迴圈

ret = re.search("-?\d+\.?\d*[\*\/]-?\d+\.?\d*",num).group() #獲取包含*/運算的算式

if re.search("-?\d+\.?\d*\*-?\d+\.?\d*",ret): #是乘的時候

n1,n2 = re.split("\*",ret) #以*分割兩邊的數字

ji = float(n1)*float(n2) #得到數字進行運算

if re.search("-\d+\.?\d*\*-\d+\.?\d*",num): #特殊情況,兩負相乘的正,得加上+

num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*",("+"+str(ji)),num,1) #替換剛算的公式

return chengchu(num) #繼續遞迴

else:

num = re.sub("-?\d+\.?\d*\*-?\d+\.?\d*", str(ji), num, 1) #一般正常情況下替換

return chengchu(num) #繼續遞迴

else: #是/的時候

n1,n2 = re.split("\/",ret) #以/分割兩邊的數字

shang = float(n1)/float(n2) #得到數字進行運算

num = re.sub("-?\d+\.?\d*\/-?\d+\.?\d*",str(shang),num,1) #一般正常情況下替換

return chengchu(num) #繼續遞迴

else: #沒有*/的時候

return num #返回算的結果

def jiajian(num):

'''加減操作'''

while re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num): #當有+-運算時迴圈

ret = re.search("-?\d+\.?\d*[\+\-]-?\d+\.?\d*",num).group() #獲取包含+-*運算的算式

if re.search("-?\d+\.?\d*\+-?\d+\.?\d*",ret): #是+的時候

n1,n2 = re.split("\+",ret) #以+分割兩邊的數字

he = float(n1)+float(n2) #得到數字進行運算

num = re.sub("-?\d+\.?\d*\+-?\d+\.?\d*",str(he),num,1) #替換剛算的公式

return jiajian(num) #繼續遞迴

else:

n1, n2 = re.split("-", ret,1) # 以-分割兩邊的數字

if n1 == "": #n1分割為空時,說明-號在開頭

n1,n2 = re.split("-",n2) #重新分割上面n2的結果

cha = -float(n1)-float(n2) #得到數字進行運算,注意前面得加上-號

else : #不是-開頭的時候

cha = float(n1) - float(n2) # 得到數字進行運算

num = re.sub("-?\d+\.?\d*--?\d+\.?\d*",str(cha),num,1) #替換剛算的公式

return jiajian(num) #繼續遞迴

else: #沒有+-的時候

return num #返回算的結果

def form(res,sums1):

'''格式輸出'''

res = re.sub("\(|\)", "", res) #去掉括號

ret = re.sub("\([^()]+\)",res,sums1,1) #把括號裡的公式替換成結果

ret = re.sub("\+\+|--", "+", ret) #統一運算子,++為+,--為+

ret = re.sub("\+-|-\+", "-", ret) #統一運算子,+-為-,-+為-

return ret #返回結果

def sear(num):

'''運算規則'''

if re.search("\([^()]+\)",num): #有括號先算

ret = re.search("\([^()]+\)", num).group() #獲取括號裡的公式

res = jiajian(chengchu(ret)) #在括號裡先算乘除,後算加減

return sear(form(res, num)) #將格式化後的結果傳給函式sear遞迴

else: #沒有括號的時候

res = jiajian(chengchu(num)) #也是先算乘除,後算加減

return res #返回結果

while true: #使用者互動模式

sums = input("請輸入您要計算的內容q(quit):") #輸入內容

if sums.lower() == "q": #輸入q時,退出

break

ret = sear(re.sub(" ","",sums)) #防止公式裡有空格,替換空格後,呼叫函式

print("最終結果:",ret) #列印最終返回的運算結果

-------------------輸出結果--------------------

最終結果: 2776672.6952380957

Python實操1 簡單計算器和進製轉化

程式要求 使用者輸入兩個數字,第一行列印出兩個數字的和,第二行列印出兩個數字的差,第三行列印出兩個數字的乘積,第四行列印出兩個數字的商,第五行列印出兩個數字的整除結果。程式 如下 使用者輸入兩個數字,第一行列印出兩個數字的和,第二行列印出兩個數字的差,第三行列印出兩個數字的乘積,第四行列印出兩個數字...

Python案例實操 函式裝飾器

help classmethod help on class classmethod in module builtins class classmethod object classmethod function method convert a function to be a class me...

python 簡易計算器

主程式 usr bin python coding utf8 import add,multipy,minus,divisi if name main print 您想做的運算是什麼?flag true while flag step1 raw input jia,jian,chen,chu if ...