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
处理代码
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}}]
二、模块倒入、调用
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())
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())
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)# 路径拼接
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()
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"}
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) # 打印生成的格式
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')
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"))
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
用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)) #设定小数位数限制

浙公网安备 33010602011771号