Python实现两款计算器功能示例
本文实例为大家分享了Python实现计算器功能示例代码,供大家参考,具体内容如下
1.简单计算器
#计算一个表达式的时候,首先肯定是先算括号里面的,再算乘除法,后算加减法
importre
#1.去括号
defremove_kuohao(expression):
'''
这是一个去除括号的函数
:paramexpression:传进来的表达式
:return:计算后的结果
'''
whileTrue:
ret=re.search(r'\([^(]*?\)',expression)#先利用正则匹配到式子里面的括号
ifret:#如果有括号
re_expression=ret.group()#先把找到的括号group()一下得到
#print(re_expression)
res=jianhua(re_expression.strip('()'))#括号里面有*/-+都不一定,就又定义了一个简化这个表达式的函数
#如果是乘法就执行乘法运算,如果是除法运算就执行除法等,这样的话就直接调用jianhua这个函数了,当然这个式子
#有括号,顺便把括号也去了,直接计算去掉括号后的式子
expression=expression.replace(re_expression,str(res))#把计算出来的结果放回去:就是把原来的括号里的表达式
#替换成现在计算的结果
#print(expression)
continue
break
res=jianhua(expression)
returnres
#简化算法
defjianhua(re_expression):
whileTrue:
#匹配乘除法
ret=re.search(r'\d+\.*?\d*[*/]\-?\d+\.?\d*',re_expression)#利用正则匹配乘除法
ifret:#如果匹配到有*或/就执行下面的代码
chengchu_expression=ret.group()#就先group一下得到有乘除法的表达式
res=chengchu(chengchu_expression)#调用乘除法的函数计算
re_expression=re_expression.replace(chengchu_expression,str(res))#吧有乘除法的表达式和计算出来的结果替换
re_expression=chulifuhao(re_expression)#在调用处理符号的函数
#print(re_expression)
continue
break
#匹配加减法
num=re.findall(r'[+-]?\d+\.?\d*',re_expression)#在没有乘除法的时候,就让匹配加减法,
iflen(num)>1:#如果匹配到的表达式的长度大于1,不过是加法还是减法,都让计算加法。因为float啥结果就是啥
mynum=0
foriinnum:
mynum+=float(i)
returnmynum
else:
returnnum[0]
#3.计算两个数的+-*/
defchengchu(expression):
if'*'inexpression:
x,y=expression.split('*')
returnfloat(x)*float(y)#返回乘法运算的结果,让res接收
if'/'inexpression:
x,y=expression.split('/')
returnfloat(x)/float(y)#返回乘法运算的结果,让res接收
defchulifuhao(expression):
if'--'inexpression:
expression=expression.replace('--','+')
if'++'inexpression:
expression=expression.replace('++','+')
if'+-'inexpression:
expression=expression.replace('+-','-')
if'-+'inexpression:
expression=expression.replace('-+','-')
returnexpression#返回结果
cmd=input('请输入你要计算的表达式:>>')
#s='1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
new_s=cmd.replace('','')#先将所有的空格去了
#print(new_s)
ret=remove_kuohao(new_s)#调用去除括号的函数,进行下一步操作
print(ret)
2.更高级的计算器
importre
fromfunctoolsimportreduce
fromtkinterimport*
'''处理特殊-号运算'''
defminus_operation(expresstion):
minus_operators=re.split("-",expresstion)
calc_list=re.findall("[0-9]",expresstion)
ifminus_operators[0]=="":
calc_list[0]='-%s'%calc_list[0]
res=reduce(lambdax,y:float(x)-float(y),calc_list)
print(">>>>>>>>>>>>>>减号[%s]运算结果:"%expresstion,res)
returnres
'''reduce()对sequence连续使用function,如果不给出initial,则第一次调用传递sequence的两个元素,
以后把前一次调用的结果和sequence的下一个元素传递给function'''
'''处理双运算符号'''
defdel_duplicates(expresstion):
expresstion=expresstion.replace("++","+")
expresstion=expresstion.replace("--","-")
expresstion=expresstion.replace("+-","-")
expresstion=expresstion.replace("--","+")
expresstion=expresstion.replace('--',"+")
returnexpresstion
'''*/运算函数'''
defmutiply_dividend(expresstion):
calc_list=re.split("[*/]",expresstion)#用*or/分割公式
operators=re.findall("[*/]",expresstion)#找出所有*和/号
res=None
forindex,iinenumerate(calc_list):
ifres:
ifoperators[index-1]=='*':
res*=float(i)
elifoperators[index-1]=='/':
res/=float(i)
else:
res=float(i)
procession0="[%s]运算结果="%expresstion,res
#final_result.insert(END,procession0)#插入窗体
print(procession0)
returnres
'''处理运算符号顺序混乱情况'''
defspecial_features(plus_and_minus_operators,multiply_and_dividend):
forindex,iinenumerate(multiply_and_dividend):
i=i.strip()
ifi.endswith("*")ori.endswith("/"):
multiply_and_dividend[index]=multiply_and_dividend[index]+plus_and_minus_operators[index]+multiply_and_dividend[index+1]
delmultiply_and_dividend[index+1]
delplus_and_minus_operators[index]
returnplus_and_minus_operators,multiply_and_dividend
defminus_special(operator_list,calc_list):
forindex,iinenumerate(calc_list):
ifi=='':
calc_list[index+1]=i+calc_list[index+1].strip()
'''运算除了()的公式+-*/'''
deffigure_up(expresstion):
expresstion=expresstion.strip("()")#去掉外面括号
expresstion=del_duplicates(expresstion)#去掉重复+-号
plus_and_minus_operators=re.findall("[+-]",expresstion)
multiply_and_dividend=re.split("[+-]",expresstion)
iflen(multiply_and_dividend[0].strip())==0:
multiply_and_dividend[1]=plus_and_minus_operators[0]+multiply_and_dividend[1]
delmultiply_and_dividend[0]
delplus_and_minus_operators[0]
plus_and_minus_operators,multiply_and_dividend=special_features(plus_and_minus_operators,multiply_and_dividend)
forindex,iinenumerate(multiply_and_dividend):
ifre.search("[*/]",i):
sub_res=mutiply_dividend(i)
multiply_and_dividend[index]=sub_res
#print(multiply_and_dividend,plus_and_minus_operators)#计算
final_res=None
forindex,iteminenumerate(multiply_and_dividend):
iffinal_res:
ifplus_and_minus_operators[index-1]=='+':
final_res+=float(item)
elifplus_and_minus_operators[index-1]=='-':
final_res-=float(item)
else:
final_res=float(item)
procession='[%s]计算结果:'%expresstion,final_res
#final_result.insert(END,procession)#插入窗体
#print(procession)
returnfinal_res
"""主函数:运算逻辑:先计算拓号里的值,算出来后再算乘除,再算加减"""
defcalculate():
expresstion=expresstions.get()#获取输入框值
flage=True
calculate_res=None#初始化计算结果为None
whileflage:
m=re.search("\([^()]*\)",expresstion)#先找最里层的()
#pattern=re.compile(r"\([^()]*\)")
#m=pattern.match(expresstion)
ifm:
sub_res=figure_up(m.group())#运算()里的公式
expresstion=expresstion.replace(m.group(),str(sub_res))#运算完毕把结果替换掉公式
else:
#print('---------------括号已经计算完毕--------------')
procession1="最终计算结果:%s\n"%figure_up(expresstion)
print(procession1)
final_result.insert(END,procession1)#插入窗体
#print('\033[31m最终计算结果:',figure_up(expresstion))
flage=False
if__name__=="__main__":
#res=calculate("1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))")
window=Tk()###创建窗体
window.title('计算器')###命名窗体
frame1=Frame(window)###框架1
frame1.pack()###放置
frame2=Frame(window)###框架2
frame2.pack()###放置
lable=Label(frame1,text="请输入公式:")###文字标签
lable.pack()
expresstions=StringVar()###输入框属性,字符串
entryname=Entry(frame1,textvariable=expresstions)###文本输入框
bt_get_expresstions=Button(frame1,text="提交",command=calculate)###按钮挂件
bt_get_expresstions.pack()
entryname.pack()
lable.grid_slaves(row=1,column=1)
entryname.grid_slaves(row=1,column=1)
bt_get_expresstions.grid_slaves(row=1,column=3)
final_result=Text(frame2)###计算结果显示框
final_result.tag_config("here",background="yellow",foreground="blue")
final_result.pack()
window.mainloop()###事件循环
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。