該計算器主要分為四個模組:
weclome_func函式用來進入介面獲取表示式,並判斷表示式是否正確,然後返回表示式;
add_sub函式用來進行加減運算,如果有多個加減運算,會遞迴,最後返回對應的值
multi_divide函式用來進行乘除運算,如果有多個乘除運算,會遞迴,最後返回對應的值
del_bracket函式用來去除小括號及呼叫multi_divide和add_sub函式,如果存在多個括號,也會實現遞迴。
**如下:
#! /usr/bin/env python3
import
sysimport
redef
welcome_func():
flag_exit =true
welcome_str = "
超級計算器
"print(welcome_str.center(50, "
*"), '\n'
)
while
flag_exit:
exp = input("
請輸入要計算的表示式[q:退出]:
").strip()
if exp == "q"
: flag_exit =false
elif len(exp) ==0:
continue
else
: exp = re.sub("
\s*", '', exp) #
# 取出空格
return
expdef
multi_divide(expression):
val = re.search("
\d+\.?\d*[*/][+-]?\d+\.?\d*
", expression) #
#匹配乘除號,如192.168*-1.99
ifnot val: #
乘除號不存在,返回輸入的表示式
return
expression
data = re.search("
\d+\.?\d*[*/][+-]?\d+\.?\d*
", expression).group()
if len(data.split('
*')) > 1: #
當可以用乘號分割,證明有乘法運算
part1, part2 = data.split('
*') #
用除號分割
value = float(part1) *float(part2)
else
: part1, part2 = data.split('/'
)
if float(part2) == 0: #
如果分母為0,則退出計算
sys.exit("
計算過程中有被除數為0的存在,計算表示式失敗!")
value = float(part1) /float(part2)
s1, s2 = re.split("
\d+\.?\d*[*/][+-]?\d+\.?\d*
", expression, 1) #
分割表示式
next_expression = "
%s%s%s
" %(s1, value, s2)
return multi_divide(next_expression) #
遞迴表示式
defadd_sub(expression):
expression = expression.replace('
+-', '
-') #
替換表示式裡的所有『+-『
expression = expression.replace('
--', '
+') #
替換表示式裡的所有『--『
expression = expression.replace('
-+', '
-') #
替換表示式裡的所有『-+『
expression = expression.replace('
++', '
+') #
替換表示式裡的所有『++『
data = re.search('
\d+\.?\d*[+-]\d+\.?\d*
', expression) #
匹配加減號
ifnot data: #
如果不存在加減號,則證明表示式已計算完成,返回最終結果
return
expression
val = re.search('
[+-]?\d+\.?\d*[+-]\d+\.?\d*
', expression).group()
if len(val.split('
+')) > 1: #
以加號分割成功,有加法計算
part1, part2 = val.split('+'
) value = float(part1) +float(part2)
elif val.startswith('
-'): #
如果是已『-『開頭則需要單獨計算
part1, part2, part3 = val.split('-'
) value = -float(part2) - float(part3) #
計算以負數開頭的減法
else
: part1, part2 = val.split('-'
) value = float(part1) -float(part2)
s1, s2 = re.split('
[+-]?\d+\.?\d*[+-]\d+\.?\d*
', expression, 1) #
分割表示式
next_expression = "
%s%s%s
" %(s1, value, s2)
return add_sub(next_expression) #
遞迴運算表示式
defdel_bracket(expression):
## [^()]+ 匹配除了括號以外的任意字元
ifnot re.search(r"
\([^()]+\)
", expression): #
判斷小括號,如果不存在小括號,直接呼叫乘除,加減計算
ret1 =multi_divide(expression)
ret2 =add_sub(ret1)
return ret2 #
返回最終計算結果
data = re.search(r"
\([^()]+\)
", expression).group() #
如果有小括號,匹配出優先順序最高的小括號
print("
獲取表示式
", data)
data = data.strip('
[\(\)]
') #
剔除小括號
ret1 =multi_divide(data)
#print("全部乘除計算完後的表示式:", ret1)
ret2 =add_sub(ret1)
#print("全部加減計算結果:", ret2)
part1, part2 = re.split(r"
\([^()]+\)
", expression, 1) #
分割表示式
expression = "
%s%s%s
" %(part1, ret2, part2)
return del_bracket(expression) #
遞迴去小括號
if__name__ == "
__main__":
try:
expression = welcome_func() #
# 獲取表示式
(expression)
result = eval(expression) #
# 用eval來驗證
(result)
ret = del_bracket(expression) #
# 用函式計算得出結果
result =float(result)
ret =float(ret)
print("
eval計算結果:
", result)
print("
表示式計算結果:
", ret)
except
(syntaxerror, valueerror, typeerror):
print("
輸入表示式不合法,請檢查!
")
如何利用Dockerfile檔案構建乙個新映象
dockerfile是由一系列引數和命令組成的指令碼,這些命令和引數應用於基礎映象並最終建立乙個新的映象。開發人員構建好乙個一致的開發環境,測試人員和運維人員就可以直接使用了。隨便找個目錄,新建個檔案,名稱必須為dockerfile 然後輸入 from centos cmd echo hello d...
構建乙個 synchronized
校對 智多芯 定稿 numbbbbb,cmb synchronized在 objective c 中是一種控制結構。它接受乙個物件指標作為引數,後面跟著一段 塊。物件指標充當鎖,在任何時候 synchronized 塊中只允許有乙個執行緒使用該物件指標。這是一種使用鎖進行多執行緒程式設計的簡單方法。...
Python利用random生成乙個列表內的隨機數
首先,需要匯入random模組 importrandom隨機取1 33之間的1個隨機數,可能重複 random.choice range 1,34 print得到一系列隨機數,執行一次得到乙個隨機數 print random.choice range 1,34 隨機取1 33之間的6個隨機數,可能重...