函数作业(前八天小复习集合)、模块、包、模块之间的调用2种、time,random模块 第十一天 2018.10.26
函数作业(前八天小复习集合)
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 #直接改变False则下一个循环时间才终止
# #False为while循环控制,改掉while判断条件终止循环;
# for循环只可以用break终止循环
#return函数也可以终止,但此处return函数,则下面无法return
#一个函数内return位置与缩进无关
# 遍历完该级下的语句,关闭掉本次循环,防止遍历下个同级下语句
break
if tag: #注意打印语句要在判断语句下,也不可以放在开始判断语句前---->按缩进自上而下执行
print('\033[1;45m%s\033[0m' %read_line,end='') #每行之间会默认多加一个换行,用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 #for循环遍历第一次就可以找到并且更改。让forread_line循环只执行一次
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') \033[1;43m \033[0m 为改变输出内容的颜色
# print('\033[1;43m用户数据是\033[0m',data) \033调用颜色,1,调量,43背景色后面是关闭
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) #insert将值插入列表中的某个位置
file_handler(backend_data,res=res,type='change')
def delete():
pass
if __name__ == '__main__': #__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 #如果输入的为空,则跳出本次循环,重新输入 本身赋值的choice默认非空
if choice == '5':break #退出
data=input('请输入你的数据:').strip()
if choice != '1': #如果不是查询功能;就需要提取数据格式,因为用户输入的都是字符串类型
data=eval(data) #data为用户输入的内容
res=msg_dic[choice](data) #res为选择执行功能函数的返回值。
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}}] maxconn最大连接数
#程序的解耦:吧文件处理整个给一个函数,每个操作函数只是很短很短
#函数、文件处理、tag的用法、程序的解耦
无生成器、装饰器
模块、包
模块:函数---->避免太多重复代码
大量用,不需要重复写---->模块
好处:提供代码的可维护性
模块一共3种:
Python标准库
第三方模块:通过pip命令自己安装模块
应用程序自定义模块
文件夹:没自动创建的_init_.py文件
包:会自动创建_init_.py文件
import 会把原py文件所有的执行一变,再把功能函数转过去。
原文件不写逻辑函数,只写功能函数
1.执行原文件
2.引入变量名
3.调用多个时间可以在一个import,之间用逗号隔开模块名
from和import配合使用
from 文件名 import 函数名/文件名
报红不一定等于报错---->pycharm有时间检测不出模块之间来回作用

from 文件名 import *---->不推荐
*代表一切,表示将文件里的所有函数都调来;数量太多时间不知道具体过来的那几个
逻辑函数中定义的函数与功能函数中引用过来的函数重名
导致逻辑函数中重名函数覆盖功能函数中重名函数
或者功能函数中重名函数覆盖逻辑函数中重名函数
被覆盖的函数是先执行的函数---->按文件执行顺序
路径
import sys跟系统相关的模块---->sys.path---->执行文件所放的路径---->用列表添加可以直接用import+文件名
from 上级目录 import 上级目录下有的需要执行的
bin文件是程序的入口---->文件相互交杂,需要一个执行的文件---->执行入口
包---->包内同一级文件名不能相同,不同级文件名可以相同,路径不同
包---->避免模块冲突
print(__name__)---->__main__
当执行py文件时__name__==__main__
当在调用文件时,输出的是调用的路径
if__name__=='__main__'
某个被引用的py文件下测试输出代码不会被执行
模块就是一个py文件
os模块是与操作系统打交道的模块---->是与操作系统交互的一个接口
sys模块是与解释器打交道的模块
time模块、random模块
json和logger模块重点
time模块:
import time

#时间戳 #计算
print(time.time()) #1540557912.5301015秒---->从1970年1月1日0点开始算到现在的秒数;
#计算两个时间相差秒数
结构化时间---当地时间
print(time.localtime(1531242343)) t=time.localtime() #获得现在时间年,月,日,周,天,时,分,秒,每年的第几天,tm_isdst=0 print(t.tm_year) #获得年份 △print(t.tm_wday) #获得每周的第n天 #-----#结构化时间---UTC---->世界标准时间 print(time.gmtime())---->世界标准时间
字符串时间
-----将结构化时间转换成时间戳
print(time.mktime(time.localtime()))
------将结构化时间转成字符串时间strftime
print(time.strftime("%Y---%m-%d %X",time.localtime()))
#%Y--->年 %m--->月 %d--->日 %X--->时分秒
------将字符串时间转成结构化时间strptime
print(time.strptime("2016:12:24:17:50:36","%Y:%m:%d:%X"))
print(time.asctime())
print(time.ctime())
sleep--->在此等待...后继续执行

import datetime print(datetime.datetime.now())
time和sys---->属于Python系统内置,不需要按照路径找
random模块---->随机模块
import random ret=random.random() #0-1的浮点型随机数 ret=random.randint(1,3) #整形最后一个数可以取 ret=random.randrange(1,3) #range最后一个数不可以取 ret=random.choice([11,22,33,44,55]) #对一个列表里的对象随机选1 ret=random.sample([11,22,33,44,55],n) #选n个 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())


浙公网安备 33010602011771号