python计算器功能_python实现计算器功能的小练习

#知识点梳理

# 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算

# 利用循环实现多个数相乘或相除

# 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。

# 考核 正则表达式的运用

# \d+(\.\d+)?[*/]-?\d+(\.\d+)? 乘除法

# [+-]?\d+(?:\.\d+)? 加减法

# \([^()]+\) 括号

# re模块的应用-----将字符串转为 列表

# re.findall() re.search() roup()

# 字符串的操作

# replace split

#知识点梳理

# 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / n次方,以及一个数的阶乘。。其余都是重复进行运算

# 利用循环实现多个数相乘或相除

# 括号的关系:是又一层的循环。利用函数嵌套关系,将运算函数进行封装。

# 考核 正则表达式的运用

# \d+(\.\d+)?[*/]-?\d+(\.\d+)? 乘除法

# [+-]?\d+(?:\.\d+)? 加减法

# \([^()]+\) 括号

# re模块的应用-----将字符串转为 列表

# re.findall() re.search() roup()

# 字符串的操作

# replace split

import re

def factorial_ts(exp): # 定义阶乘算法

if exp == 0 or exp == 1:

return 1

else:

return exp * factorial_ts(exp-1)

def power_ts(exp_1,exp_2): # 定义n次方

if exp_2 == 0:

return 1

elif exp_2 == 1:

return exp_1

else:

return exp_1 * power_ts(exp_1,exp_2-1)

def atom_cal(exp):

if '*' in exp: #计算单个的乘法

a,b = exp.split('*')

return str(float(a) * float(b))

elif '/' in exp: #计算单个的除法

a, b = exp.split('/')

return str(float(a) / float(b))

def format_exp(exp): #处理符号的问题

exp = exp.replace('--','+')

exp = exp.replace('+-','-')

exp = exp.replace('-+','-')

exp = exp.replace('++','+')

return exp

def mul_div(exp): #计算乘除法

while True:

ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) #利用正则表达式匹配乘或除法

if ret: #如果匹配到的话

atom_exp = ret.group() #将这个值拿出来

res = atom_cal(atom_exp) #调用上面个的atom_cal计算

exp = exp.replace(atom_exp,res) #将计算的结果把原来的算是替换掉

else:return exp #如果匹配不到的话说明乘除法计算完毕,返回计算结果

def add_sub(exp): #计算加减法

ret = re.findall('[+-]?\d+(?:\.\d+)?', exp) #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表

exp_sum = 0

for i in ret:

exp_sum += float(i) #将列表中的每一项求和

return exp_sum

def factorial_exp(exp): # 计算阶乘

while True:

exp_f = re.search('\d+(?:\.\d+)?!',exp) # 匹配符合阶乘形式的结果

# print(info_f)

if exp_f:

info_f = exp_f.group()

ret_f = factorial_ts(int(info_f[:-1])) # 遍历匹配到的阶乘,将数字和运算号区分,并计算值

# print(ret_f)

exp = exp.replace(info_f, str(ret_f)) # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值

# print(exp)

else:return exp # 如果没有匹配到,则返回原值

# print(factorial_exp('5-3!-4!+5!+6'))

def power_exp(exp):

while True: # 计算n次方

info_p = re.search('\(-(?:\d+(?:\.\d+)?)\)\*\*\d+|\d+(?:\.\d+)?\*\*\d+',exp) # 匹配符合n次方形式的结果

# print(info_p)

if info_p:

info_p = info_p.group()

# print(info_p)

exp_1, exp_2 = info_p.split('**')

ret_p = power_ts(float(exp_1), int(exp_2))

exp = exp.replace(info_p, str(ret_p)) # 将计算结果替换输入的运算中需计算阶乘的位置,完成阶乘的运算并返回值

# print(exp)

else:

return exp # 如果没有匹配到,则返回原值

# print(power_exp('2**4-3!-3**2+90/3/3'))

def cal(exp): #计算加减乘除混合运算

exp = factorial_exp(exp)

exp = power_exp(exp)

exp = mul_div(exp) #调用mul_div函数先计算乘除法

exp = format_exp(exp) #调用format_exp处理计算时候的符号

exp_sum = add_sub(exp) #调用add_sub计算加减法

return exp_sum # float #返回计算结果

def c_input():

str_fh = '+-*/!**.() '

while True:

info = input('请输入需要计算的数,输入完毕后按回车结束\n')

i = 0

while i

if info[i] not in str_fh and str.isdigit(info[i]) is False:

print('您输入的数字和运算符号不合法')

break

i += 1

if i == len(info):

return info

# print(c_main())

def main():

exp = c_input()

# print(exp)

exp = exp.replace(' ','') #删除字符串中的空格

# print(exp)

while True:

ret = re.search('\([^()]+\)',exp) #匹配括号

# print(ret)

if ret : #如果匹配到的话

inner_bracket = ret.group() #用group()将匹配到的括号内容取出来

# print(inner_bracket)

res = str(cal(inner_bracket)) #调用cal()计算括号中的内容,将返回的结果转换成字符串

# print(res)

exp = exp.replace(inner_bracket,res) #将匹配到的括号中的内容用计算结果替换

# print(exp)

exp = format_exp(exp) #处理符号

# print(exp)

else:break #直到没有括号跳出循环

print(cal(exp))

# return cal(exp) #将剩下的内容进行计算,然后返回

if __name__ == '__main__':

main()

本文地址:https://blog.csdn.net/duyue1/article/details/107135221

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值