1. 程式人生 > >180119 計算器的優化版

180119 計算器的優化版

lac 再次 其中 設定 nothing bre pil 第一個 com

print("\033[31;1m歡迎使用計算器\033[0m".center(59,"-"))
import sys,time #導入模塊 sys模塊,time模塊

f = open("intro.txt",r) #打開文件 同一個目錄裏的名為“intro”的文件,打開為讀取

for line in f:  #循環讀取剛剛打開的f的行line; for...in... 循環 ;for..in語句是個循環語句,它叠代一個對象的序列,現在,你需要知道的是一個序列只是一個有序的項目的集合。
    for i in line: #循環讀取文字;讀取上一行讀取的行line裏的每個文字,生成列表i
sys.stdout.write(i) #標準輸出 這就是導入sys模塊的原因,用到其中的stdout.write,後面跟上(i)——標準輸出上一行的文字列表i sys.stdout.flush() #刷新 這是間隔一段時間刷新的意思,sys.stdout .flush ... time.sleep(0.05) #輸出時間控制 再次看到time模塊的.sleep ,參數設定為(0.1)秒 import re,os,sys  #導入 re os sys 模塊 具體運用到的功能詳解。 def compute_exponent(arg):  #定義一個函數 指數計算  ps() 裏的arg 前幾天的博文裏有記錄作用和含義
""" 操作指數 :param expression:表達式 :return:計算結果 """ val = arg[0]  #聲明一個變量 val = arg   ps.列表是零 pattern = re.compile(r\d+\.?\d*[\*]{2}[\+\-]?\d+\.?\d*)    #有點復雜了,起碼用上了re.compile 正則表達式…… mch = pattern.search(val)    # 不太懂了!! if not mch: return content = pattern.search(val).group()
if len(content.split(**))>1: n1, n2 = content.split(**) value = float(n1) ** float(n2) else: pass before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_exponent(arg) def compute_mul_div(arg): """ 操作乘除 :param expression:表達式 :return:計算結果 """ val = arg[0] pattern = re.compile(r\d+\.?\d*[\*\/\%\/\/]+[\+\-]?\d+\.*\d*) mch = pattern.search(val) if not mch: return content = pattern.search(val).group() if len(content.split(*))>1: n1, n2 = content.split(*) value = float(n1) * float(n2) elif len(content.split(//))>1: n1, n2 = content.split(//) value = float(n1) // float(n2) elif len(content.split(%))>1: n1, n2 = content.split(%) value = float(n1) % float(n2) elif len(content.split(/))>1: n1, n2 = content.split(/) value = float(n1) / float(n2) else: pass before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_mul_div(arg) def compute_add_sub(arg): """ 操作加減 :param expression:表達式 :return:計算結果 """ while True: if arg[0].__contains__(+-) or arg[0].__contains__("++") or arg[0].__contains__(-+) or arg[0].__contains__("--"): arg[0] = arg[0].replace(+-,-) arg[0] = arg[0].replace(++,+) arg[0] = arg[0].replace(-+,-) arg[0] = arg[0].replace(--,+) else: break if arg[0].startswith(-): arg[1] += 1 arg[0] = arg[0].replace(-,&) arg[0] = arg[0].replace(+,-) arg[0] = arg[0].replace(&,+) arg[0] = arg[0][1:] val = arg[0] pattern = re.compile(r\d+\.?\d*[\+\-]{1}\d+\.?\d*) mch = pattern.search(val) if not mch: return content = pattern.search(val).group() if len(content.split(+))>1: n1, n2 = content.split(+) value = float(n1) + float(n2) else: n1, n2 = content.split(-) value = float(n1) - float(n2) before, after = pattern.split(val, 1) new_str = "%s%s%s" % (before,value,after) arg[0] = new_str compute_add_sub(arg) def compute(expression): """ 操作加減乘除 :param expression:表達式 :return:計算結果 """ inp = [expression,0] # 處理表達式中的指數 compute_exponent(inp) # 處理表達式中的乘除求余等 compute_mul_div(inp) # 處理表達式的加減 compute_add_sub(inp) if divmod(inp[1],2)[1] == 1: result = float(inp[0]) result = result * -1 else: result = float(inp[0]) return result def exec_bracket(expression): """ 遞歸處理括號,並計算 :param expression: 表達式 :return:最終計算結果 """ pattern = re.compile(r\(([\+\-\*\/\%\/\/\*\*]*\d+\.*\d*){2,}\)) # 如果表達式中已經沒有括號,則直接調用負責計算的函數,將表達式結果返回,如:2*1-82+444 #if not re.search(‘\(([\+\-\*\/]*\d+\.*\d*){2,}\)‘, expression): if not pattern.search(expression): final = compute(expression) return final # 獲取 第一個 只含有 數字/小數 和 操作符 的括號 # 如: # [‘1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘] # 找出:(-40.0/5) content = pattern.search(expression).group() # 分割表達式,即: # 將[‘1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘] # 分割更三部分:[‘1-2*((60-30+( (-40.0/5) *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘] before, nothing, after = pattern.split(expression, 1) print(分解中:,expression) content = content[1:len(content)-1] # 計算,提取的表示 (-40.0/5),並活的結果,即:-40.0/5=-8.0 ret = compute(content) print(%s=%s %( content, ret)) # 將執行結果拼接,[‘1-2*((60-30+( -8.0 *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘] expression = "%s%s%s" %(before, ret, after) print(下一步:,expression) print("~"*10,按優先級運算ing...,"~"*10) # 循環繼續下次括號處理操作,本次攜帶者的是已被處理後的表達式,即: # [‘1-2*((60-30+ -8.0 *(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘] # 如此周而復始的操作,直到表達式中不再含有括號 return exec_bracket(expression) # 使用 __name__ 的目的: # 只有執行 python index.py 時,以下代碼才執行 # 如果其他人導入該模塊,以下代碼不執行 if __name__ == "__main__": flag = True while flag: calculate_input = input(\033[43m請輸入要計算的算式 | (退出請按q)\033[0m) calculate_input = re.sub(\s*,‘‘,calculate_input) if len(calculate_input) == 0: continue elif calculate_input == q: print("歡迎使用,再見!".center(48, "-")) exit() elif re.search([^0-9\.\-\+\*\/\%\/\/\*\*\(\)],calculate_input): print(\033[31m 輸入錯誤,請重新輸入!!!\033[0m) else: result = exec_bracket(calculate_input) print(\033[31m最終的計算結果是: %s\033[0m % result)

好吧,這段代碼比較長,而且個人感覺還不夠完美,只解析了括號內的運算

180119 計算器的優化版