Python实现简单的计算器

需求描述:

1、实现加减乘除及拓号优先级解析

2、用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果

实现代码:

  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) )")

原文地址:https://www.cnblogs.com/zijue/p/9809851.html

时间: 2024-10-27 09:59:08

Python实现简单的计算器的相关文章

教学项目之-通过Python实现简单的计算器

教学项目之-通过Python实现简单的计算器 计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2

通过Python实现简单的计算器

计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 #coding=utf-8 import re def sub_calc(formula): """ 计算一个加减乘除表达式

第一个python程序简单加法计算器

#-*- coding:utf-8 -*- # 获取用户输入内容 first_num = raw_input('plesea your first num : ') # 打印用户first num print "your first num is %r." % first_num # 获取用户输入内容 second_num = raw_input('plesea your second num : ') # 打印用户second num print "your second 

用Python编写简单的发红包程序和计算器原理

用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成分为单位 ret = random.sample(range(1,money),num-1) #在最低钱数1分与总钱数之间生成人数减1个数作为数轴的节点 ret.sort() #对列表进行排序 ret.insert(0,0) ret.append(money) for i in range(len(

Python Tkinter学习之计算器

初学Python tkinter,利用目前所学编写一个简单的计算器练习一下. 预期效果: 1.能够实现加减乘除运算, 2.只能输入数字 3.通过按钮选择进行哪种运算. 4.结果框不能修改,智能复制 5.按清除按钮能够清除所有内容 from  tkinter import * count = Tk() count.title("纯醪八盅@计算器") def clear():     v1.set("")     v2.set("")     v3.

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(Caliburn.Micro框架概述 - https://blog.csdn.net/lzuacm/article/details/78886436) 是一个轻量级的WPF框架,简化了WPF中的不少用法,推荐做WPF开发时优先使用. 真正快速而熟练地掌握一门技术就可以尝试着用最快的

python中简单文件的输入三种方式

最近在自学python,简单的总结了一下文件的输入的方式. 1. f=open("foo.txt") line=f.readline() while line: print(line,end='') line=f.readline() f.close() 2. for line in open("foo.txt"): print(line,end='') 3. f=open("foo.txt") lines=f.readlines() for l

JS实现一个简单的计算器

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElementById( id名 ).value 获取或设置 id名的值. 第三步: 获取通过下拉框来选择的值来改变加减乘除的运算法则. 提示:使用switch判断运算法则. 第四步:  通过 = 按钮来调用创建的函数,得到结果. 注意: 使用parseInt

Python实现简单的猜数字游戏

Python实现简单的猜数字游戏,具体如下: 随机生成一个1-10之间的数字,让用户来猜,当猜错时,会提示猜的数字是大还是小了,直到用户猜对为止. import random secret = random.randint(1,10) #print(secret) print('------猜数字游戏!-----') guess = 0 while guess != secret: temp = input('猜数字游戏开始,请输入数字:') guess = int(temp) if guess