• 常用模块,软件开发规范


    常用模块II,软件开发规范

    一, 软件开发规范

    1. 为什么要规范开发:

      • 全写在一个py文件中,文件加载慢,代码可读性差,查询麻烦
      • 所以要将一个py文件分开,合理的分成多个py文件
    2. 程序配置:

      • 统一相同的变量.比如模拟博客园登陆中多次使用文件路径,为了修改好这个文件路径,可以在文件的最上方写一个变量指向这个路径,代码中直接引用这个变量,修改时只需修改这个变量
    3. 文件划分:

      1. setting.py

        配置文件,用于放置一些项目中需要的静态参数,比如文件路径,数据库配置,软件的默认设置等等,比如上面所说的文件路径

      2. common.py

        公共组件文件,用于放置一些常用的公共组件函数,并不是核心逻辑的函数,而更像是服务于整个程序中的公用的插件,程序中需要即调用,比如装饰器,密码加密功能,序列化功能,日志功能等

      3. src.py

        核心文件,主要存放的就是核心逻辑功能

      4. start.py

        项目启动文件,目的是显眼,方便开启

      5. 类似register文件

        文件名不固定,储存数据的文件,类似于文本数据库,项目中有时会遇到将一些数据储存到文件中,与程序交互的情况,所以要单独设置在这样的文件

      6. log文件

        储存log日志的文件

    4. 划分具体目录

      blog
      |__bin  begin---开始
      |  |__start.py  ---开关
      |
      |__conf   config---设置;配置
      |  |__settings.py  ---静态文件
      |
      |__core  ---核心
      |  |__src.py --- 主逻辑文件
      |
      |__db  datebase---数据库
      |  |__register
      |
      |__lib  libary-- 网络编辑器
      |  |__commmon.py ---公共组件文件
      |
      |__log  --- 日志
      |  |__access.log  自述 日志
      |__README
      
    5. 按照项目目录结构,规范模拟博客园登录

      1. 配置 start.py

        import sys
        import os
        print(os.path.dirname(__file__)) #获取本文件所在文件夹即bin的绝对路径
        print(os.path.dirname(os.path.dirname(__file__)))  #获取本文件夹所在文件夹bin所在的文件夹blog的绝对路径
        BATH_DIY = os.path.dirname(os.path.dirname(__file__))
        sys.path.append(BATH_DIR)
        
        from core.src import run
        if __name__ == '__main__':
        	run()
        #或
        #from core import src
        if __name__ == '__main__'
        	src.run()
        
      2. 配置setting.py文件

        #配置静态文件,不会轻易改变
        import os
        print(os.path.dirname(os.path.dirname(__file__)))
        #获取当前文件所在的目录的上级目录,即blog
        print(os.path.join(os.path.dirname(os.path.dirname(__file__)),r'db
        egister))
        
        file_name = os.path.join(os.path.dirname(os.path.dirname(__file__)),r'db
        egister)    #拼接出register的路径
        
      3. 配置common.py文件

        from core import src
        #用src.status_dic来引用src中的status_dic
        #在启动start.py时,已经把blog的路径添加到sys.path中了,意味着,在整个项目中的任何py文件,都可以引用到blog项目下的任何目录:bin,conf,core,db.lib,log这几个,所以此处可以直接应用src
        
      4. 配置src.py文件

        from conf import settings
        from lib import common
        用settings.file_name引用settings中的file_name
        用common.wrapper引用common中的装饰器
        
      5. README

        1. 软件定位,软件的基本功能
        2. 运行代码的方法:安装环境,启动命令
        3. 简要的使用说明
        4. 代码目录结构说明,更详细点可以说是说明软件的基本原理
        5. 常见问题说明

    二,内置模块II

    一,time模块

    1. 在python中,通常有三种时间来表示时间:

      • 时间戳((times stamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行'type(time.time())',返回的是float类型

        import time
        t = time.time()
        print(t)
        
      • 格式化时间的字符串(format time):

        import time
        t1 = time.strftime('%Y-%m-%d %H:%M:%S')
        print(t1)
        
        t2 = time.strftime('%Y{}%m{}%d{} %H:%M:%S')
        t3 = t2.format('年','月','日')
        print(t3)
        
        %y 两位数的年份表示(00-99)
        %Y 四位数的年份表示(000-9999)
        %m 月份 (01-12)
        %d 月内中的一天(0-31)
        %H 二十四小时制的小时数(0-23)
        %I 12小时制小时数(01-12)
        %M 分钟数(00=59)
        %S 秒(00-59)
        %a 本地简化星期名称
        %A 本地完整星期名称
        %b 本地简化的月份名称
        %B 本地完整的月份名称
        %c 本地相应的日期表示和时间表示
        %j 年内的一天(001-366)
        %p 本地A.M.或P.M.的等价符
        %U 一年中的星期数(00-53)星期天为星期的开始
        %w 星期(0-6),星期天为星期的开始
        %W 一年中的星期数(00-53)星期一为星期的开始
        %x 本地相应的日期表示
        %X 本地相应的时间表示
        %Z 当前时区的名称
        %% %号本身
        
        
      • 结构化时间,元组(struct time):

        t = time.localtime()
        print(t)
        打印结果:time.struct_time(tm_year=2019, tm_mon=6, tm_mday=29, tm_hour=10, tm_min=27, tm_sec=38, tm_wday=5, tm_yday=180, tm_isdst=0)
        
        
        
      • 小结:时间戳是计算机能够识别的语言,格式化时间是人能够看懂的时间,结构化时间则是用来操作时间的

    2. 几种格式之间的转换

      • import time
        # 格式化时间--->结构化时间
        ft = time.strftime('%Y-%m-%d %H:%M:%S')
        st = time.strptime(ft, '%Y-%m-%d %H:%M:%S') # 此处格式必须与上方相同
        print(st)
        # 结构化时间--->时间戳
        t = time.mktime(st)
        print(t)
        # 时间戳--->结构化时间
        t = time.time()
        st = time.localtime(t)
        print(st)
        # 结构化时间--->格式化时间
        ft = time.strftime('%Y-%m-%d %H:%M:%S', st)
        print(ft)
        
        
        #结构化时间 --> %a %b %d %H:%M:%S %Y串
        #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
        >>>time.asctime(time.localtime(1500000000))
        'Fri Jul 14 10:40:00 2017'
        >>>time.asctime()
        'Mon Jul 24 15:18:33 2017'
        
        #时间戳 --> %a %d %d %H:%M:%S %Y串
        #time.ctime(时间戳)  如果不传参数,直接返回当前时间的格式化串
        >>>time.ctime()
        'Mon Jul 24 15:19:07 2017'
        >>>time.ctime(1500000000)
        'Fri Jul 14 10:40:00 2017' 
        
        t = time.time()
        ft = time.ctime(t)
        print(ft)
        
        st = time.localtime()
        ft = time.asctime(st)
        print(ft)
        
        
      1. 计算时间差

        t1 = '2017-09-11 08:30:00'
        t2 = '2019-05-11 08:50:00'
        st1 = time.strptime(t1, '%Y-%m-%d %H:%M:%S')
        st2 = time.strptime(t2, '%Y-%m-%d %H:%M:%S')
        tt1 = time.mktime(st1)
        tt2 = time.mktime(st2)
        time_dif = tt2 - tt1
        struct_time = time.localtime(time_dif)
        print(struct_time)
        print(f'过去了{struct_time.tm_year-1970}年{struct_time.tm_mon-1}月{struct_time.tm_mday-1}天{struct_time.tm_hour}小时{struct_time.tm_min}分钟{struct_time.tm_sec}秒')
        
        

    二,datetime模块

    import datetime
    now_time = datetime.datetime.now()
    # 现在的时间2019-06-28 19:47:21.339993
    --------------------------------------------------
    # 只能调整的字段: week days hours minutes seconds
    print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
    print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
    print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
    print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天后
    print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小时后
    print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小时前
    print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
    print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分钟后
    print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
    print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒后
    --------------------------------------------------
    # 可直接调整到指定的 年 月 日 时 分 秒 等
    now_time = datetime.datetime.now()
    print(current_time.replace(year=1977))  # 直接调整到1977年
    print(current_time.replace(month=1))  # 直接调整到1月份
    print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601
    --------------------------------------------------
    # 将时间戳转化成时间
    print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17
    
    

    三,random模块

    import random
    # 随机小数
    random.random()  # 大于0且小于1之间的小数
    random.uniform(1, 3) # 大于1小于3的小数
    # ----------------------------------------
    # 随机整数
    random.randint(1, 5) # 大于等于1且小于等于5之间的整数
    random.randrange(1, 10, 2) # 大于等于1且小于10之间的奇数
    # ----------------------------------------
    # 随机选择一个返回
    random.choice([1, '23', [4, 5]])  # 1或者23或者[4,5]
    
    # 随机选择多个返回
    random.sample([1, '23', [4, 5]], 2) # 列表元素任意2个组合
    # ----------------------------------------
    # 打乱列表顺序
    lst = [1, 2, 3, 4, 5, 6]
    random.shuffle(lst)
    print(lst) # 随机顺序
    
    
    # 模拟随机验证码
    import random
    def v_code():
        code = ''
        for i in range(5):
            num = random.randint(0, 9)
            alf = chr(random.randint(65, 90))  # chr()通过序号查字符
            add = random.choice([num, alf])
            code = code + str(add)
        return code
    
    print(v_code())
    
    
  • 相关阅读:
    做题总结
    关于SQLSERVER中用SQL语句查询的一些个人理解
    关于SQLSERVER联合查询一点看法
    C#中怎样实现序列化和反序列化
    java内部类的使用
    C#抽象类
    匿名类
    Foreach能够循环的本质
    C#索引器
    深入了解接口的使用
  • 原文地址:https://www.cnblogs.com/maqian/p/11905283.html
Copyright © 2020-2023  润新知