代码改变世界

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