python實現計算機

來源:互聯網
上載者:User

標籤:ota   dex   arch   AC   mutiply   span   turn   ccaction   lam   

  1 import re  2 import functools  3    4    5 def minus_operator_handler(formula):  6     ‘‘‘處理一些特殊的減號運算‘‘‘  7     minus_operators = re.split("-",formula)  8     calc_list= re.findall("[0-9]",formula)  9     if minus_operators[0] == ‘‘: #第一值肯定是負號 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減號[%s]處理結果:\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     ‘‘‘算乘除,傳進來的是字串噢‘‘‘ 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]運算結果=\033[0m" %formula, res  ) 37     return res 38 def handle_minus_in_list(operator_list,calc_list): 39     ‘‘‘有的時候把算術符和值分開後,會出現這種情況  [‘-‘, ‘-‘, ‘-‘] [‘ ‘, ‘14969037.996825399 ‘, ‘ ‘, ‘12.0/ 10.0 ‘] 40        這需要把第2個列表中的空格都變成負號並與其後面的值拼起來,噁心死了 41     ‘‘‘ 42     for index,i in enumerate(calc_list): 43         if i == ‘‘: #它其實是代表負號,改成負號 44             calc_list[index+1] = i + calc_list[index+1].strip() 45 def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend): 46     ‘‘‘有時會出現這種情況 , [‘-‘, ‘-‘] [‘1 ‘, ‘ 2 * ‘, ‘14969036.7968254‘],2*...後面這段實際是 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     ‘‘‘這裡計算是的不帶括弧的公式‘‘‘ 56   57     formula = formula.strip("()") #去除外麵包的拓號 58     formula = remove_duplicates(formula) #去除外重複的+-號 59     plus_and_minus_operators = re.findall("[+-]", formula) 60     multiply_and_dividend = re.split("[+-]", formula) #取出乘除公式 61     if len(multiply_and_dividend[0].strip()) == 0:#代表這肯定是個減號 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     #開始運算+,- 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: #代表不是第一次迴圈 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]運算結果:\033[0m" %formula,total_res) 84     return total_res 85   86 def calc(formula): 87     ‘‘‘計算程式主入口, 主要邏輯是先計算拓號裡的值,算出來後再算乘除,再算加減‘‘‘ 88     parenthesise_flag = True 89     calc_res = None #初始化運算結果為None,還沒開始運算呢,當然為None啦 90     while parenthesise_flag: 91         m = re.search("\([^()]*\)", formula) #找到最裡層的拓號 92         if m: 93             #print("先算拓號裡的值:",m.group()) 94             sub_res = compute(m.group()) 95             formula = formula.replace(m.group(),str(sub_res)) 96         else: 97             print(‘\033[41;1m----沒拓號了...---\033[0m‘) 98   99             print(‘\n\n\033[42;1m最終結果:\033[0m‘,compute(formula))100             parenthesise_flag = False #代表公式裡的拓號已經都被剝除啦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) )")

 

python實現計算機

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.