#知识点梳理

# 计算器的编程本文主要考虑思路:运算最小单元就是两个数的 = - * / 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()

python计算器函数_用Python实现计算器函数的一个小练习,python,功能相关推荐

  1. 爬虫的一个小案例:python实现英汉互译

    什么是网络爬虫? 网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序.众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容. 一个小案例:py ...

  2. python imshow参数_用matplotlib中imshow()函数绘图

    matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...

  3. python项目了解_神级程序员都是这样来开源 Python 项目!今天算是涨知识了!

    工具和概念 项目布局 当准备一个项目时,正确合理的布局(目录结构)是十分重要的.一个合理的布局意味着想参与开发者不必花时间来寻找某些代码的位置; 凭直觉就可以找到文件的位置.因为我们在处理一个项目,就 ...

  4. python面试题_春招苦短,我用百道Python面试题备战

    对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔.那么你了解过Python编程面试题吗?从Python基础到网页爬虫你是否能全方位Hold住?今天,机器之心为读者们 ...

  5. python制作中秋贺卡_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图.图1. 月饼效 ...

  6. 调python返回图片_三个好习惯,帮你写好Python里的异常处理

    如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在.打个比方,当你在脚本执行时按 ctrl+c 退出,解释器就会产生一个 KeyboardInterrupt 异常.而 K ...

  7. python做日历牌_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图. 图1. 月饼 ...

  8. python埃及分数_送你一份低折扣书单,Python就占了6本,人工智能2本

    小编没什么好礼物送给大家的,这里有几本超低折扣的几本书,分享给你,为您省点小钱,不谢哟!此书单中,Python书有6本,少儿编程书4本,人工智能书2本.哪一本是你的菜,自己选吧! 文中这几本书折扣价在 ...

  9. python quit()讲解_看完本文若不能让你学通“Python”,我将永远退出编程界

    许多时候,学习过后的效果不好,可能是一些坏习惯自己还没有意识到!这篇文章教程希望可以给各位一些学习效率高坚持到底的勇气 01 学习上不明白自己要干什么.该干什么,总是让老师在后面推着屁股走.自学的朋友 ...

最新文章

  1. 用python画时序图源代码_使用python实现画AR模型时序图
  2. KMP算法的实现以及改进
  3. python Windows和Linux路径表示问题
  4. java重新执行_(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...
  5. Springboot跨域 ajax jsonp请求
  6. [召集令]-Dijkstra的单源最短路径算法
  7. java后端工程师平时开发或多或少会用到Myeclipse,那么它有哪些快捷键呢
  8. 太极发送卡片软件_QQ卡片式消息一键发送app
  9. idea怎么给项目改名_微软改名部惹祸了
  10. 文章内容分页功能实现
  11. 《RabbitMQ 实战指南》第五章 RabbitMQ 进阶(下)
  12. KPN iTV的敏捷转型之旅
  13. devstack mysql_devstack 安装openstack newton版
  14. python数组初始化_Python科学计算库Numpy数组的初始化和基本操作
  15. java小写金额转大写工具类
  16. c#调用microsoft word将word另存为pdf
  17. python-获取图片的exif信息
  18. 班级学生德育量化管理系统_德育积分学分考核系统_学生操行日常行为规范考核系统
  19. GCTA学习8 | GCTA计算多性状遗传力和遗传相关
  20. 三态内容寻址存储器(TCAM)工作原理

热门文章

  1. 沉浸式夜游的发展应充分挖掘文化内涵
  2. 计算机毕业设计之java+ssm校园视频监控系统
  3. HDOJnbsp;nbsp;2048nbsp;nbsp;nbsp;神、上帝以及老天爷
  4. 中国科技的家底是什么?
  5. 大厂后端二面,关于分布式事务灵魂十连质问,你能回答多少?
  6. NVDIA Jetson TX2软件介绍
  7. matlab中m文件的好处,请教matlab中M文件问题?
  8. 将sentinel.jar做成windows服务
  9. Mysql和js试题_JS和MySQL常见问题
  10. iis配置跨域请求头