Python007-实例
2018-04-20 16:33 Ashome123 阅读(178) 评论(0) 收藏 举报一、 计算器
import re
def check(s):
'''
检测非法字符,合法化
:param s:
:return:
'''
if re.findall('[^0-9+\-*/ ()]',s): # 如果检测到不是[0-9+\-*/ ()]的字符
print('非法字符!')
return False
elif s.count('(') != s.count(')'):
print('括号数不对!')
return False
return True
def no_space(s):
'''
规范化
:param s:
:return:
'''
s = s.replace(' ','')
s = s.replace('++','+')
s = s.replace('--','+')
s = s.replace('+-','-')
s = s.replace('-+','-')
s = s.replace('*+','*')
s = s.replace('/+','/')
return s
def aa(s):
s = str(round(s,18))
return s
def cal_mul_div(s):
'''
计算乘除
:param s:
:return:
'''
while '*' in s or '/' in s:
s_mul = re.search('-?\d+\.?\d*\*-?\d+\.?\d*',s) # ‘-’零到一次,数字一到多次,‘.’零到一次(小数),数字多次,‘*’一次,‘-’零到一次,数字一到多次,‘.’零到一次,数字多次
s_div = re.search('-?\d+\.?\d*/-?\d+\.?\d*',s) # ‘-’零到一次,数字一到多次,‘.’零到一次(小数),数字多次,‘/’一次,‘-’零到一次,数字一到多次,‘.’零到一次,数字多次
print('s_mul:',s_mul)
print('s_div:',s_div)
# 除法
if s_div:
x, y = s_div.group().split('/')
print('s_div.group:',s_div.group())
print('x:', x)
print('y:', y)
ret = '+'+aa(float(x) / float(y))
print('ret1:',ret)
ret = no_space(ret)
print('ret2:',ret)
s = s.replace(s_div.group(),ret)
print('s:', s, '\n')
#乘法
elif s_mul:
x,y = s_mul.group().split('*')
print('x_mul:',x)
print('y_mul:',y)
ret = '+'+aa(float(x) * float(y))
print('ret:',ret)
ret = no_space(ret)
print('ret:',ret)
s = no_space(s.replace(s_mul.group(),ret))
print('s:',s,'\n')
# print('break了吗')
# break
return s
def cal_add_sub(s):
'''
计算加减
:param s:
:return:
'''
while '+' in s or '-' in s[2:]:
s_add = re.search('-?\d+\.?\d*\+-?\d+\.?\d*',s)
s_sub = re.search('-?\d+\.?\d*--?\d+\.?\d*',s)
print('s_add:',s_add)
print('s_sub:',s_sub)
# 减法
if s_sub:
x, y = s_sub.group().split('-')
print('x:', x)
print('y:', y)
ret = aa(float(x) - float(y))
s = s.replace(s_sub.group(), ret)
print('s:',s,'\n')
#加法
elif s_add:
x,y = s_add.group().split('+')
print('x:',x)
print('y:',y)
ret = aa(float(x) + float(y))
s = s.replace(s_add.group(),ret)
print('s:',s,'\n')
# break
return no_space(s)
if __name__ == '__main__':
source = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
if check(source):
s_correct = no_space(source)
# 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
# s_correct = '(-8.0)'
# print('s_correct:',s_correct)
while re.search('\(',s_correct): #如果有左括号
print('-------first---------')
s1 = re.search('\([^()]+\)',s_correct).group() # 匹配里面没有括号的括号:(-40/5)
print('s1:',s1)
if '*' in s1 or '/' in s1: #如果括号内有乘除
s_1 = cal_mul_div(s1)
print('s_1:', s_1)
s_correct = no_space(s_correct.replace(s1,s_1))
print('s_correct1:', s_correct)
elif '+' in s1 or '-' in s1[2:]: #如果括号内有加减
s_2 = cal_add_sub(s1)
print('s_2:', s_2)
s_correct = no_space(s_correct.replace(s1, s_2))
print('s_2:', s_2)
else:
s_correct = no_space(s_correct.replace(s1,s1[1:-1]))
print('s_correct3:',s_correct)
# 没括号 1-2 * -1386416.96
print('--------没括号啦!-------')
print('s_correct:',s_correct)
a = re.search('[^\d]',s_correct)
b = re.findall('[^\d]',s_correct)
print('a:',a.group(),'b:',b)
while re.search('[^\d.]', s_correct):
print('---------second--------')
c= re.search('[^\d]', s_correct)
print('c:',c)
# if re.search('(-?\d+\.?\d*)\*/(-?\d+\.?\d*)',s_correct):
# print('s1:',s1)
if '*' in s_correct or '/' in s_correct:
s1 = re.search('-?\d+\.?\d*[*/]-?\d+\.?\d*', s_correct).group()
print('s1:',s1)
s_1 = cal_mul_div(s1)
s_correct = no_space(s_correct.replace(s1, s_1))
print('s_correct:',s_correct)
elif '+' in s_correct or '-' in s_correct:
s1 = re.search('-?\d+\.?\d*[+\-]-?\d+\.?\d*', s_correct).group()
print('s1:',s1)
s_2 = cal_add_sub(s1)
s_correct = no_space(s_correct.replace(s1, s_2))
print('s_correct:',s_correct)
# break
#正确答案:2776672.6952380957
二、 ATM
程序结构:
day5-atm/
├── README
├── atm # ATM主程目录
│ ├── __init__.py
│ ├── bin # ATM执行文件目录
│ │ ├── __init__.py
│ │ ├── atm.py # ATM执行程序
│ │ └── manage.py # ATM 管理端,未实现
│ ├── conf #配置文件
│ │ ├── __init__.py
│ │ └── settings.py
│ ├── core # 主要程序逻辑都在这个目录里
│ │ ├── __init__.py
│ │ ├── accounts.py # 用于从文件里加载和存储账户数据
│ │ ├── auth.py # 用户认证模块
│ │ ├── db_handler.py # 数据库连接引擎
│ │ ├── logger.py # 日志记录模块
│ │ ├── main.py # 主逻辑交互程序
│ │ └── transaction.py # 记账\还钱\取钱等所有的与账户金额相关的操作
│ ├── db # 用户数据存储的地方
│ │ ├── __init__.py
│ │ ├── account_sample.py # 生成一个初始的账户数据,把这个数据存成一个以这个账户id为文件名的文件放在accounts目录,程序会去这里找
│ │ └── accounts # 存各个用户的账户数据,一个用户一个文件
│ │ └── 1234.json # 一个用户账户示例文件
│ └── log # 日志目录
│ ├── __init__.py
│ ├── access.log # 用户访问和操作的相关日志
│ └── transactions.log # 所有的交易日志
└── shopping_mall #电子商城程序,需单独实现
└── __init__.py

浙公网安备 33010602011771号