• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
KK筑梦人
博客园    首页    新随笔    联系   管理    订阅  订阅

函数作业(前八天小复习集合)、模块、包、模块之间的调用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())

  

  

  

 

  

 

posted @ 2018-10-26 22:40  KK筑梦人  阅读(114)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3