用python编写一个简单计算器
计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 # 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) # 等类似算式后,必须自己解析里面的(),+,-,*,/符号和公式,利用递归算法
拿到这个题目时,感觉无从下手。老师说利用开学来3天学习的知识是可以做出来的。然后我认真归纳总结前3天学习的基础知识,经过3天3夜的奋战终于给弄出来了。虽然中途也有想过放弃,但是没有耕耘哪来的收获。如果初学的同学想借鉴的话, 建议自己先仔细想想,如果实在无从下手可以参考下我的。特写此文以自勉。程序中可能出现很多冗余或bug,望勿见笑。下面我先说说我的思路。
- 先构造几个函数方法用来进行最初的运算(加减乘除)
- 在运算函数中,先传入一个字符串,将字符串利用正则表达式,findall函数生成可以取元素的列表形式,利用返回值,
- 先进行加法和减法运算,加减法能顺利通过验证,结果无误
- 在算式中增加乘法和除法,用if语句进行判断,如果有乘法和除法,需优先进行计算,通过验证后
- 在算式中增加括号,增加括号后,需要进行for循环遍历,如果遍历的元素中包含括号,则优先处理计算括号里面的
- 利用列表临时存储返回值,赋给原来的算式,进行递归,这样算式越来越精简。最终得出结果。
简单流程图如下:
以下是实现代码:
#!/usr/bin/env python
#-*-coding:utf-8 -*-
import re
# 定义函数
def add(x , y): #相加
return x + y
def subtract(x, y): #相减
return x - y
def multiply(x, y): #相乘
return x * y
def divide(x, y): #相除
return x / y
temp=[0] #定义一个临时列表,并且赋值0,用来存储结果
temp1=[] #定义一个临时列表,用来临时存储列表
def sum2(ret): #定义一个函数用来进行数据的处理,运算
for index,mark in enumerate(ret): #遍历列表,赋值给mark
if str(mark).count("(")==1 and str(mark).startswith("("): #如果mark中包含“(”并且以其开头
ret.pop(index) #将该值(mark),在列表中移除
mark1=re.findall('^\(\-[0-9.]+|[0-9.]+|[*/+]|[-]',mark) #将mark元素,再次生成列表
h = float(re.sub('\(', '', mark1.pop(0))) #将该表的第一个元素取出,并且将其中所包含的括号替换移除
mark1.insert(