python开发学习 day21,22,23-python模块(1.tag用法 2.函数编程 3.文件处理 4.程序的解耦 5.模块)

一、通过代码了解一下4点

1.tag的用法

2.函数编程

3.文件处理

4.程序的解耦

 

要处理的文件

global
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy1.org
        server 101.1000.7.9 101.1000.7.9 weight 20 maxconn 30
        server 2.2.2.7 2.2.2.7 weight 30 maxconn 4000
        server 10.10.10.1 10.10.10.1 weight 22 maxconn 2000
        server 2.2.2.5 2.2.2.5 weight 30 maxconn 4000

backend www.oldboy2.org
        server 3.3.3.3 3.3.3.3 weight 20 maxconn 3000
backend www.oldboy20.org
        server 10.10.0.10 10.10.0.10 weight 9999 maxconn 33333333333
View Code

 

处理代码

import os
def file_handler(backend_data,res=None,type='fetch'):
    if type == 'fetch':
        with open('haproxy.conf','r') as read_f:
            tag=False
            ret=[]
            for read_line in read_f:
                if read_line.strip() == backend_data:
                    tag=True
                    continue
                if tag and read_line.startswith('backend'):
                        # tag=False
                        break
                if tag:
                    print('\033[1;45m%s\033[0m' %read_line,end='')
                    ret.append(read_line)
        return ret
    elif type == 'change':
        with open('haproxy.conf', 'r') as read_f, \
                open('haproxy.conf_new', 'w') as write_f:
            tag = False
            has_write = False
            for read_line in read_f:  # server
                if read_line.strip() == backend_data:
                    tag = True
                    continue
                if tag and read_line.startswith('backend'):
                    tag = False
                if not tag:
                    write_f.write(read_line)
                else:
                    if not has_write:
                        for record in res:
                            write_f.write(record)
                        has_write = True
        os.rename('haproxy.conf', 'haproxy.conf.bak')
        os.rename('haproxy.conf_new', 'haproxy.conf')
        os.remove('haproxy.conf.bak')

def fetch(data):
    # print('\033[1;43m这是查询功能\033[0m')
    # print('\033[1;43m用户数据是\033[0m',data)
    backend_data='backend %s' %data
    return file_handler(backend_data)



def add():
    pass

def change(data):
    # print('这是修改功能')
    # print('用户输入的数据是',data)
    backend=data[0]['backend'] #文件当中的一条记录 www.oldboy1.org
    backend_data='backend %s' %backend #backend www.oldboy1.org
    #       server 2.2.2.4 2.2.2.4 weight 20 maxconn 3000

    old_server_record='%sserver %s %s weight %s maxconn %s\n' %(' '*8,data[0]['record']['server'],
                                                              data[0]['record']['server'],
                                                              data[0]['record']['weight'],
                                                              data[0]['record']['maxconn'])

    new_server_record = '%sserver %s %s weight %s maxconn %s\n' % (' ' * 8, data[1]['record']['server'],
                                                                 data[1]['record']['server'],
                                                                 data[1]['record']['weight'],
                                                                 data[1]['record']['maxconn'])
    print('用户想要修改的记录是',old_server_record)
    res=fetch(backend) #fetch('www.oldboy1.org')
    print('来自change函数--》',res)
    if not res or old_server_record not in res:
        return '你要修改的记录不存在'
    else:
        index=res.index(old_server_record)
        res[index]=new_server_record

    res.insert(0,'%s\n' %backend_data)
    file_handler(backend_data,res=res,type='change')


def delete():
    pass

if __name__ == '__main__':
    msg='''
    1:查询
    2:添加
    3:修改
    4:删除
    5:退出
    '''
    msg_dic={
        '1':fetch,
        '2':add,
        '3':change,
        '4':delete,
    }

    while True:
        print(msg)
        choice=input('请输入你的选项:').strip()
        if not choice:continue
        if choice == '5':break

        data=input('请输入你的数据:').strip()

        if choice != '1':
            data=eval(data)

        res=msg_dic[choice](data)
        print('最终结果是--》',res)
# [{'backend':'www.oldboy1.org','record':{'server':'2.2.2.4','weight':20,'maxconn':3000}},{'backend':'www.oldboy1.org','record':{'server':'2.2.2.5','weight':30,'maxconn':4000}}]
View Code

 

二、模块倒入、调用

import :

  1.执行对应文件

  2.引入变量名

 

2.1 import 

 

2.2 from  import 

 

2.3 from  import * 

 

2.4 运行本质

sys.path 只能定义到执行脚本的路径,要想找下同级目录下的模块,需要加载 from my_module import cal,如下目录结构

--lesson

  --my_module

      --cal

  --bin

 

2.5 package 

1. 组织模块

2. 防止重复变量

...

 

2.6

if  __name__ == "__main__":

 

三、内置模块

3.1 time  (****)

 

 

import time

#时间戳  #计算
# print(time.time())    #1481321748.481654秒

#结构化时间---当地时间
# print(time.localtime(1531242343))
# t=time.localtime()
# print(t.tm_year)
# print(t.tm_wday)
# #-----#结构化时间---UTC
# print(time.gmtime())

#-----将结构化时间转换成时间戳

# print(time.mktime(time.localtime()))
#------将结构化时间转成字符串时间strftime
#print(time.strftime("%Y---%m-%d %X",time.localtime()))
#------将字符串时间转成结构化时间strptime
#print(time.strptime("2016:12:24:17:50:36","%Y:%m:%d:%X"))

# print(time.asctime())
# print(time.ctime())


# import datetime
# print(datetime.datetime.now())
View Code

 

3.2 random (**)

import random

# ret=random.random()
# ret=random.randint(1,3)
# ret=random.randrange(1,3)
# ret=random.choice([11,22,33,44,55])
# ret=random.sample([11,22,33,44,55],2)
# ret=random.uniform(1,4)
#
# print(ret)
# ret=[1,2,3,4,5]
# random.shuffle(ret)
# print(ret)

def v_code():
    ret=""
    for i in range(5):
        num=random.randint(0,9)
        alf=chr(random.randint(65,122))
        s=str(random.choice([num,alf]))
        ret+=s
    return ret
print(v_code())
View Code

 

 

3.3 os (****)

import os

# print(os.getcwd())
# os.chdir("..")
# print(os.getcwd())

#os.makedirs('dirname1/dirname2')
#os.removedirs("dirname1/dirname2")
#print(os.listdir())
#print(os.stat("sss.py"))

# print(os.system("dir"))

print(os.path.split(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
print(os.path.dirname(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
print(os.path.basename(r"C:\Users\Administrator\脱产三期\day22\sss.py"))
a="C:\Users\Administrator"
b="脱产三期\day22\sss.py"

os.path.join(a,b)#  路径拼接
View Code

 

3.4 sys (***) 

import sys
# print(sys.argv)
#
# command=sys.argv[1]
# path=sys.argv[2]
#
# if command=="post":
#     pass
#
# elif command=="get":
#     pass

import time
for i in range(100):
    sys.stdout.write("#")
    time.sleep(0.1)
    sys.stdout.flush()
View Code

 

3.5 re (****)

.    通配符,匹配任意字符,除了\n换行符

^  开头

*  上一个字符0到无穷次

+  上一个字符1到无穷次

{}  {0,1}0至1次  {6}6次

前面 . * + 等,都是贪婪匹配,也就是尽可能多的匹配,后面加?号,使其变成惰性匹配 

 

-------元字符之字符集 []

[.*]    之中的全是字符,并不是通配符 

几个特殊意义的符号  

[a-z]   代表a到z

[^a-z]  代表非a-z

\   转义

 

#python解释器需要做一次转义传给re,re再做一次转义,所有又4个\

re.findall('c\\\\l','c\lsirgns') or  re.findall(r'c\\l','c\lsirgns')

 

|   管道符   或者左边 或者右边 

re.findall('ka|bc','ka|basd')    ----['ka']

re.findall('ka|bc','ka|bcasd')    ---['ka','bc']

 

()  分组   优先级,优先拿出括号里匹配到的 去优先级(?:)

re.findall('www\.(baidu|163)\.com','www.baidu.com')   ---> ['baidu']

re.findall('www\.(?:baidu|163)\.com','www.baidu.com')   ---> ['www.baidu.com']

 

re.search('(?P<name>[a-z]+)','alex39tom40').group('name')   -----> 'alex'

 

re的方法

re.findall('a','agfsga')    找出所有匹配到的结果

re.search('a','alien yuan').group()  仅显示第一个匹配的结果

re.match('a','ab').group()  同search, 不过是仅在字符串开始处进行匹配

re.split('[ab]','abcd')  ['','','cd']   先按a分割,得到''和'bcd',再对''和'bcd'分别按b分割

re.sub('\d','abc','ales56asd5',1)  替换,1表示只替换一次,即只替换第一个5

re.subn('\d','abc','ales56asd5',1)   ('alesabcabcasdabc',3)  会打印出替换了几处

 

re.compile()    

obj = re.compile('\d{3}')

ret = obj.search('abc123eeee')

print(ret)  #123    提前定义好匹配的规则

 

 

3.6 json & pickle (json ************)

# dic='{"name":"alex"}'
# f=open("hello","w")
# f.write(dic)

# f_read=open("hello","r")
# data=f_read.read()
# print(type(data))
# data=eval(data)
# print(data["name"])

# import json
#
#
# dic={'name':'alex'}#---->{"name":"alex"}----->'{"name":"alex"}'
# i=8                 #---->'8'
# s='hello'          #---->"hello"------>'"hello"'
# l=[11,22]           #---->"[11,22]"
#
# f=open("new_hello","w")

# dic_str=json.dumps(dic)
# f.write(dic_str)    #json.dump(dic,f)



# f_read=open("new_hello","r")
# data=json.loads(f_read.read())      # data=json.load(f)

#
# print(data["name"])
# print(data)
# print(type(data))

# print(s)
# print(type(s))


# data=json.dumps(dic)
#
# print(data)     #{"name": "alex"}
# print(type(data))


#注意:
# import json
#
# with open("Json_test","r") as f:
#     data=f.read()
#     data=json.loads(data)
#     print(data["name"])

#----------------------pickle-------
import pickle

dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}

print(type(dic))  # <class 'dict'>

# j = pickle.dumps(dic)
# print(type(j))  # <class 'bytes'>
#
# f = open('序列化对象_pickle', 'wb')  # 注意是w是写入str,wb是写入bytes,j是'bytes'
# f.write(j)  # -------------------等价于pickle.dump(dic,f)
#
# f.close()
# # -------------------------反序列化
import pickle

f = open('序列化对象_pickle', 'rb')

data = pickle.loads(f.read())  # 等价于data=pickle.load(f)

print(data['age'])
# # -------------------------shelve模块---------
import shelve

f = shelve.open(r'shelve1')  # 目的:将一个字典放入文本 f={}
#
# f['stu1_info']={'name':'alex','age':'18'}
# f['stu2_info']={'name':'alvin','age':'20'}
# f['school_info']={'website':'oldboyedu.com','city':'beijing'}
# f.close()

print(f.get('stu1_info')['age'])



# dic={}
#
# dic["name"]="alvin"
# dic["info"]={"name":"alex"}
View Code

 

3.7 xml

# import xml.etree.ElementTree as ET
#
#
#
# tree = ET.parse("xml_lesson")
# root = tree.getroot()
# print(root.tag)


# for i in root:
#
#     #print(i.tag)
#     #print(i.attrib)
#     for j in i:
#         #print(j.tag)
#         #print(j.attrib)
#         print(j.text)




# # 遍历xml文档
# for child in root:
#     print(child.tag, child.attrib)
#     for i in child:
#         print(i.tag, i.text)

# 只遍历year 节点
# for node in root.iter('year'):
#     print(node.tag, node.text)
# # ---------------------------------------

# import xml.etree.ElementTree as ET
#
# tree = ET.parse("xml_lesson")
# root = tree.getroot()

# 修改
# for node in root.iter('year'):
#     new_year = int(node.text) + 1
#     node.text = str(new_year)
#     node.set("updated", "yes")
#
# tree.write("xml_lesson")
#
# 删除node
# for country in root.findall('country'):
#     rank = int(country.find('rank').text)
#     if rank > 50:
#         root.remove(country)
#
# tree.write('output.xml')


# import xml.etree.ElementTree as ET
#
# new_xml = ET.Element("namelist")
#
# name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})
# age = ET.SubElement(name, "age", attrib={"checked": "no"})
# sex = ET.SubElement(name, "sex")
# sex.text = '33'
# name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
# age = ET.SubElement(name2, "age")
# age.text = '19'



et = ET.ElementTree(new_xml)  # 生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True)

#ET.dump(new_xml)  # 打印生成的格式
View Code

 

3.8 logging模块 (*****)

import logging

logging.debug('debug message')

logging.info('info message')

logging.warning('warning message')

lgging.error('error message')

logging.critical('critical message')

import logging

#-----------------------------------logging.basicConfig
# logging.basicConfig(
#     level=logging.DEBUG,
#     filename="logger.log",
#     filemode="w",
#     format="%(asctime)s %(filename)s[%(lineno)d]  %(message)s"
#
#
# )
#
# logging.debug('hello')
# logging.info('hello')
# logging.warning('warning message')
# logging.error('error message')
# logging.critical('critical message')

#-----------------------------------logger
# def logger():
#     logger=logging.getLogger()
#
#
#     fh=logging.FileHandler("test_log")
#     #ch=logging.StreamHandler()
#
#     fm=logging.Formatter("%(asctime)s  %(message)s")
#
#     fh.setFormatter(fm)
#     #ch.setFormatter(fm)
#
#     logger.addHandler(fh)
#     #logger.addHandler(ch)
#     logger.setLevel("DEBUG")
#
#     return logger
# #----------------------
# logger=logger()
#
# logger.debug("debug")
# logger.info("info")
# logger.warning("warning")
# logger.error("error")
# logger.critical("critical")
#--------------------------------------------------
import logging

logger=logging.getLogger()


logger1 = logging.getLogger('mylogger')
logger1.setLevel(logging.DEBUG)

# logger2 = logging.getLogger('mylogger')
# logger2.setLevel(logging.WARNING)


fh=logging.FileHandler("test_log-new")
ch=logging.StreamHandler()

# logger.addHandler(ch)
# logger.addHandler(fh)

logger1.addHandler(fh)
logger1.addHandler(ch)

# logger2.addHandler(fh)
# logger2.addHandler(ch)


# logger.debug('logger debug message')
# logger.info('logger info message')
# logger.warning('logger warning message')
# logger.error('logger error message')
# logger.critical('logger critical message')

# logger1.debug('logger1 debug message')
# logger1.info('logger1 info message')
# logger1.warning('logger1 warning message')
# logger1.error('logger1 error message')
# logger1.critical('logger1 critical message')

# logger2.debug('logger2 debug message')
# logger2.info('logger2 info message')
# logger2.warning('logger2 warning message')
# logger2.error('logger2 error message')
# logger2.critical('logger2 critical message')
View Code

 

3.9 configparser模块(**)

# import configparser
#
# config = configparser.ConfigParser()     #config={}
#
#
#
#
# config["DEFAULT"] = {'ServerAliveInterval': '45',
#                      'Compression': 'yes',
#                      'CompressionLevel': '9'}
#
#
#
# config['bitbucket.org'] = {}
# config['bitbucket.org']['User'] = 'hg'
#
# config['topsecret.server.com'] = {}
# topsecret = config['topsecret.server.com']
# topsecret['Host Port'] = '50022'  # mutates the parser
# topsecret['ForwardX11'] = 'no'  # same here
#
#
#
# with open('example.ini', 'w') as f:
#     config.write(f)


#------------------------------------------------------增删改查、
import configparser

config = configparser.ConfigParser()

#---------------------------------------------查
# print(config.sections())   #[]
#
config.read('example.ini')
# #
# print(config.sections())   #['bitbucket.org', 'topsecret.server.com']
#
# print('bytebong.com' in config)# False
# #
# print(config['bitbucket.org']['User']) # hg
# #
# print(config['DEFAULT']['Compression']) #yes
# #
# print(config['topsecret.server.com']['ForwardX11'])  #no
#
#
# for key in config['bitbucket.org']:
#     print(key)

#
#
#print(config.options('bitbucket.org'))#['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']
#print(config.items('bitbucket.org'))  #[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')]

#print(config.get('bitbucket.org','compression'))#yes
#
#
# #---------------------------------------------删,改,增(config.write(open('i.cfg', "w")))
#
#
config.add_section('yuan')
config.set('yuan','k1','11111')

config.remove_section('topsecret.server.com')
config.remove_option('bitbucket.org','user')
#

config.write(open('i.cfg', "w"))
View Code

 

4.0 hashlib模块(**)

import hashlib

obj=hashlib.md5()

# obj.update("admin".encode("utf8"))
# print(obj.hexdigest())    #21232f297a57a5a743894a0e4a801fc3

obj.update("adminroot".encode("utf8"))
print(obj.hexdigest())#   4b3626865dc6d5cfe1c60b855e68634a
                      #   4b3626865dc6d5cfe1c60b855e68634a
View Code

 

 

用re编写计算器

import re

# 加法
def plus(s):
    if re.search("^\d+[.]?\d*\+\d+[.]?\d*", s) != None:
        str_re = re.search("\d+[.]?\d*\+\d+[.]?\d*", s).group()
        x = float(re.search("^\d+[.]?\d*", str_re).group())
        y = float(re.search("\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x + y))
        return result
    elif re.search("^\-\d+[.]?\d*\+", s) != None:
        str_re = re.search("^\-\d+[.]?\d*\+\d+[.]?\d*", s).group()
        x = float(re.search("^\-\d+[.]?\d*", str_re).group())
        y = float(re.search("\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x + y))
        return result


# 减法
def minus(s):
    if re.search("^\d+[.]?\d*\-\d+[.]?\d*", s) != None:
        str_re = re.search("\d+[.]?\d*\-\d+[.]?\d*", s).group()
        x = float(re.search("^\d+[.]?\d*", str_re).group())
        y = float(re.search("\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x - y))
        return result
    elif re.search("^\-\d+[.]?\d*\-", s) != None:
        str_re = re.search("^\-\d+[.]?\d*\-\d+[.]?\d*", s).group()
        x = float(re.search("^\-\d+[.]?\d*", str_re).group())
        y = float(re.search("\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x - y))
        return result
    elif re.search('^\-\d+[.]?\d*$', s) != None:
        str_re = re.search('^\-\d+[.]?\d*$', s).group()
        return str_re


# 乘法
def mutiply(s):
    if re.search("^[\-]?\d+[.]?\d*\*[\-]?\d+[.]?\d*", s) != None:
        str_re = re.search("[\-]?\d+[.]?\d*\*[\-]?\d+[.]?\d*", s).group()
        x = float(re.search("^[\-]?\d+[.]?\d*", str_re).group())
        y = float(re.search("[\-]?\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x * y))  # 设定小数位数限制
        return result
    else:
        err = 'Maybe anything is Error!'
        return err


# 除法
def division(s):
    if re.search("^[\-]?\d+[.]?\d*\/[\-]?\d+[.]?\d*", s) != None:
        str_re = re.search("[\-]?\d+[.]?\d*\/[\-]?\d+[.]?\d*", s).group()
        x = float(re.search("^[\-]?\d+[.]?\d*", str_re).group())
        y = float(re.search("[\-]?\d+[.]?\d*$", str_re).group())
        result = str('{:.15f}'.format(x / y))  # 设定小数位数限制
        return result
    else:
        err = 'Maybe anything is Error!'
        return err


# 检查是否有中文,有中文返回True
def check_zh(s):
    check_zh = ('\u4e00' <= i <= '\u9fa5' for i in s)
    for zh in check_zh:
        if zh:
            return True
        else:
            continue


# 检查输入的计算式是否有错误,此处做中间空格删除处理,有字母中文报错
def check_str(s):
    checkblank_list = re.findall('\s', s)
    checkword_list = re.findall('[A-Za-z]', s)
    if check_zh(s):
        err = "Error:计算式中出现中文!"
        print(err)
        return False
    if re.findall('[+\-*/(]$', s):
        print('计算式结尾不能为+ - * / ( ')
        return False
    if re.findall('[()]', s):  # 中文括号替换为英文的
        # print('Error:计算式中出现文括号!')
        s = re.sub('', '(', s)
        s = re.sub('', ')', s)
        # return False
    if checkblank_list and (not checkword_list):
        s_list = re.split(' ', s)
        # print (s_list)
        s = ''.join(s_list)
        s_list = list(s)
        i = s_list.count('(')
        k = s_list.count(')')
        if i == k:  # 检查括号前括号和后括号数量是否匹配
            return s
        else:
            print("The brackets Error,Pls Check!")
            return False
    elif (not checkword_list) and (not checkword_list):
        s_list = list(s)
        i = s_list.count('(')
        k = s_list.count(')')
        if i == k:  # 检查括号前括号和后括号数量是否匹配
            return s
        else:
            print("The brackets Error,Pls Check!")
            return False
    else:
        err = "ERR:\nThe inputting expression evaluation Error!Pls try again!"
        print(err)


# 计算结果后的+- 和--情况替换
def format_str(s):
    while True:
        if re.findall('(\+\-)|(\-\-)', s):
            if re.findall('^\-\-', s):
                s = re.sub('^\-\-', '', s)
            s = re.sub('\+\-', '-', s)
            s = re.sub('\-\-', '+', s)
            continue
        else:
            break
    return s


# 括号内计算
def bracket_rules(s):
    old_s = s
    while re.findall("\([^()]+\)", old_s):
        # print('计算式:',old_s)
        inner_bracket = re.search("\([^()]+\)", old_s).group()
        inner_bracket_str = re.search('[^()]+', inner_bracket).group()  # 去掉括号

        if re.findall('^[\-]?\d+[.]?\d*$', inner_bracket_str):
            old_s = old_s.replace(inner_bracket, inner_bracket_str)
            old_s = format_str(old_s)
            continue
        result_bracket = no_bracket_rules(inner_bracket_str)
        old_s = old_s.replace(inner_bracket, result_bracket)
    return old_s


# 无括号时四则混合运算
def no_bracket_rules(s):
    result_str = s
    while not re.findall('^[\-]?\d+[.]?\d*$', result_str):
        # print("计算式:",result_str)
        if re.findall('(\*)|(\/)', result_str):
            f = re.search("(\*)|(\/)", result_str).group()
            if f == "*":
                # if re.findall('\d+[.]?\d*\*[\-]?\d+[.]?\d*',result_str):
                exprssion = re.search('\d+[.]?\d*\*[\-]?\d+[.]?\d*', result_str).group()
                result = mutiply(exprssion)  # 乘法结果
                # print("%s 结果:%s" % (exprssion, result))
                result_str = result_str.replace(exprssion, result)
                result_str = format_str(result_str)
                continue
            elif f == '/':
                # elif re.findall('\d+[.]?\d*\/[\-]?\d+[.]?\d*',result_str):
                exprssion = re.search('\d+[.]?\d*\/[\-]?\d+[.]?\d*', result_str).group()
                result = division(exprssion)
                # print("%s 结果:%s" % (exprssion, result))
                result_str = result_str.replace(exprssion, result)
                result_str = format_str(result_str)
                continue
        elif re.findall('(\-)|(\+)', result_str):
            f2 = re.search("(\-)|(\+)", result_str).group()
            if f2 == '+':
                # if re.findall("(\d+[.]?\d*\+\d+[.]?\d*)|(^\-\d+[.]?\d*\+)",result_str):
                exprssion = re.search('(\d+[.]?\d*\+[\-]?\d+[.]?\d*)|(^[\-]?\d+[.]?\d*\+[\-]?\d+[.]?\d*)',
                                      result_str).group()
                result = plus(exprssion)
                # print("%s 结果:%s" % (exprssion, result))
                result_str = result_str.replace(exprssion, result)
                result_str = format_str(result_str)
                continue
            elif f2 == '-':
                if re.search('(\d+[.]?\d*\-[\-]?\d+[.]?\d*)|(^[\-]?\d+[.]?\d*\-[\-]?\d+[.]?\d*)', result_str):
                    # elif re.findall("(\d+[.]?\d*\-\d+[.]?\d*)|(^\-\d+[.]?\d*\-\d+[.]?\d+)",result_str):
                    exprssion = re.search('(\d+[.]?\d*\-[\-]?\d+[.]?\d*)|(^[\-]?\d+[.]?\d*\-[\-]?\d+[.]?\d*)',
                                          result_str).group()
                    result = minus(exprssion)
                    # print("%s 结果:%s" % (exprssion, result))
                    result_str = result_str.replace(exprssion, result)
                    result_str = format_str(result_str)
                    continue
                elif re.search('^[\-]?\d+[.]?\d*\+[\-]?\d+[.]?\d*', result_str):
                    exprssion = re.search('^[\-]?\d+[.]?\d*\+[\-]?\d+[.]?\d*', result_str).group()
                    result = plus(exprssion)
                    # print("%s 结果:%s"%(exprssion,result))
                    result_str = result_str.replace(exprssion, result)
                    result_str = format_str(result_str)
                    continue

    return result_str


# 计算
def calculator(expression):
    if re.findall('[()]', expression):
        result_bracket = bracket_rules(expression)
        result = no_bracket_rules(result_bracket)
        return result
    elif re.findall('[^()]', expression):
        result = no_bracket_rules(expression)
        return result


# 执行计算
def running_calculator():
    while True:
        expression = input(
            "----------------\nPlease input + - * / ( ) to calculate\n[q exit]\033[1;36;43m>>:\033[0m ").strip()
        check_s = check_str(expression)
        if len(expression) == 0:
            continue
        elif expression == 'q':
            print("Exit Calculator...")
            break
        elif check_s:
            result = calculator(check_s)
            print("\033[1;36;43m❤The END Result:\033[0m", result)
        else:
            continue


# 启动运行
running_calculator()


# 位数多了·· 出错~~~ @_@  计算过程中小数位数太多用e- 表示时会有问题···死循环 规避该问题 格式化小数位数   
#
# result = str('{:.15f}'.format(x*y)) # 设定小数位数限制
# result = str('{:.15f}'.format(x/y)) #设定小数位数限制
View Code

 

posted @ 2018-11-18 10:20  apoorgod  阅读(113)  评论(0)    收藏  举报