数值运算mopn程序python,Python设计实现的计算器功能完整
实例
Python设计实现的计算器功能完整实例
这⾥有新鲜出炉的Python多线程编程,程序狗速度看过来!
Python编程语⾔
Python 是⼀种⾯向对象、解释型计算机程序设计语⾔,由Guido van Rossum于1989年底发明,第⼀个公开发⾏版发⾏于1991年。Python语法简洁⽽清晰,具有丰富和强⼤的类库。它常被昵称为胶⽔语⾔,它能够把⽤其他语⾔制作的各种模块(尤其是C/C++)很轻松地联结在⼀起。
这篇⽂章主要介绍了Python设计实现的计算器功能,结合完整实例形式分析了Python3.5实现计算器功能的正则、字符串及数值运算等相关操作技巧,需要的朋友可以参考下
本⽂实例讲述了Python设计实现的计算器功能。分享给⼤家供⼤家参考,具体如下:
通过利⽤PYTHON 设计处理计算器的功能如:
1 -
2 * ( (60-30 +(-40/5) * (9-2*5/
3 + 7 /3*99/4*2998 +10 * 568/1
4 ))- (-4*3)/(16-3*2))
我的处理计算基本思路是:
解题思路是,需要优先处理内层括号运算--外层括号运算--先乘除后加减的原则:
1、正则处理⽤户输⼊的字符串,然后对其进⾏判断,判断计算公式是否有括号,有就先将计算公式进⾏正则处理,先获取最⾥层的每⼀个数据,然后⼀⼀计算
所要⽤到的正则是:
inner=re.search("\([^()]*\)",calc_input)
2、把有括号的计算公式计算出来的结果替换原来初始公式的位置,计算之前分别对重复运算符进⾏处理
需要处理的重复运算的函数是
defdel_double(str):
place("++","+")
place("--","-")
place("+-","-")60进制计算器
place("- -","-")
place("+ +","+")
returnstr
3、然后依次从⾥到外去除括号并进⾏计算,和位置替换
calc_input=up(),str(ret))
将计算出来的结果分别替换原计算公式
4、最后得出没有括号的公式,合并调⽤计算控制函数进⾏计算,中间需要注意的就是 负号 和数字与*在⼀起的处理,其它还算可以。
具体逻辑思路图是:
以下是完整的代码:
#!/usr/bin/env python3.5
# -*-coding:utf8-*-
importre
a=r'1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2))' # */运算函数
defshengchu(str):
calc=re.split("[*/]",str)#⽤*/分割公式
OP=re.findall("[*/]",str)#出所有*和/号
ret=None
forindex,iinenumerate(calc):
ifret:
ifOP[index-1]=="*":
ret*=float(i)
elifOP[index-1]=="/":
ret/=float(i)
else:
ret=float(i)
returnret
# 去掉重复运算,和处理特列+-符号
defdel_double(str):
place("++","+")
place("--","-")
place("+-","-")
place("- -","-")
place("+ +","+")
returnstr
# 计算主控制函数
defcalc_contrl(str):
tag=False
str=str.strip("()")# 去掉最外⾯的括号
str=del_double(str)# 调⽤函数处理重复运算
find_=re.findall("[+-]",str)# 获取所有+- 操作符
split_=re.split("[+-]",str)#正则处理 以+-操作符进⾏分割,分割后 只剩*/运算符
iflen(split_[0].strip())==0:# 特殊处理
split_[1]=find_[0]+split_[1]# 处理第⼀个数字前有“-”的情况,得到新的带符号的数字# 处理第⼀个数字前为负数“-",时的情况,可能后⾯的操作符为“-”则进⾏标记
iflen(split_)==3andlen(find_)==2:
tag=True
delsplit_[0]# 删除原分割数字
delfind_[0]
else:
delsplit_[0]# 删除原分割数字
delfind_[0]# 删除原分割运算符
forindex,iinenumerate(split_):
# 去除以*或/结尾的运算数字
split_[index]=split_[index]+find_[index]+split_[index+1]
delsplit_[index+1]
delfind_[index]
forindex,iinenumerate(split_):
ifre.search("[*/]",i):# 先计算含*/的公式
sub_res=shengchu(i)#调⽤剩除函数
split_[index]=sub_res
# 再计算加减
res=None
forindex,iinenumerate(split_):
ifres:
iffind_[index-1]=="+":
res+=float(i)
eliffind_[index-1]=="-":
# 如果是两个负数相减则将其相加,否则相减
iftag==True:
res+=float(i)
else:
res-=float(i)
else:
# 处理没有括号时会出现i 为空的情况
ifi!="":
res=float(i)
returnres
if__name__=='__main__':
calc_input=input("请输⼊计算公式,默认为:%s:"%a).strip()
try:
iflen(calc_input)==0:
calc_input=a
calc_input=r'%s'%calc_input# 做特殊处理,保持字符原形
flag=True# 初始化标志位
result=None# 初始化计算结果
# 循环处理去括号
whileflag:
inner=re.search("\([^()]*\)",calc_input)#先获取最⾥层括号内的单⼀内容
#up())
# 有括号时计算
ifinner:
ret=calc_up())# 调⽤计算控制函数
calc_input=up(),str(ret))# 将运算结果,替换原处理索引值处对应的字符串print("处理括号内的运算[%s]结果是:%s"%(up(),str(ret)))
#flag = True
# 没有括号时计算
else:
ret=calc_contrl(calc_input)
print("最终计算结果为:%s"%ret)
#结束计算标志
flag=False
except:
print("你输⼊的公式有误请重新输⼊!")
PS:这⾥为⼤家推荐⼏款js实现的计算⼯具供⼤家参考借鉴:
补充:
PYTHON正则表达式⼀览:
模式
描述
^
匹配字符串的开头
$
匹配字符串的末尾。
.
匹配任意字符,除了换⾏符,当re.DOTALL标记被指定时,则可以匹配包括换⾏符的任意字符。[...]
⽤来表⽰⼀组字符,单独列出:[amk] 匹配 'a','m'或'k
[^...]
不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*
匹配0个或多个的表达式。
re+
匹配1个或多个的表达式。
re?
匹配0个或1个由前⾯的正则表达式定义的⽚段,⾮贪婪⽅式
re{ n}
re{ n,}
精确匹配n个前⾯表达式。
re{ n, m}
匹配 n 到 m 次由前⾯的正则表达式定义的⽚段,贪婪⽅式
a| b
匹配a或b
(re)
G匹配括号内的表达式,也表⽰⼀个组
(?imx)
正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)
正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)
类似 (...), 但是不表⽰⼀个组
(?imx: re)
在括号中使⽤i, m, 或 x 可选标志
(?-imx: re)
在括号中不使⽤i, m, 或 x 可选标志

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。