• 包和一些常用模块


        • 回顾调用一个模块的过程:
          1、运行执行文件,创建一个执行文件的名称空间
          2、创建模块文件的名称空间
          3、执行模块文件中的代码,将产生的名字放入模块的名称空间中
          4、在执行文件中拿到一个指向模块名称空间的名字
        • 定义:
          包是一种通过使用 .模块名 来组织python模块名称空间的方式,包的本质还是一个模块
        • 具体的:
          包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来
        • 需要强调的是:
          1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,
          ​而在python2中,包下一定要有该文件,否则import 包报错
          2. 创建包的目的不是为了运行,而是被导入使用,​记住,包只是模块的一种形式而已,包的本质就是一种模块
        • 首次导入包的执行过程:
          1、先运行执行文件,创建一个执行文件的名称空间
          2、创建包下面的__init__.py文件的名称空间
          3、执行包下面的__Init__.py文件中的代码,将产生的名字放入包下面的__init__.py文件得我名称空间中
          4、在执行文件中拿到一个指向包下面的__init__.py文件名称空间的名字
        • 包的导入之注意事项:
        • 1、包的导入可以使用import和from...import...两种。
          但是无论在什么位置,导入时都要遵循一个原则:凡是导入时带点的,点的左边必须是一个包,就是 .包名 的形式,否则非法。可以带有一连串的点,如 item.subitem.subsubitem 但是导入后,在使用时就没有这种限制了,点的左边可以使包,函数,模块,类(她们都可以用点的方式调用自己的属性)
        • 2、import导入文件是,产生名称空间中的名字来源于文件,“ import 包 ”产生的名称空间的名字同样来源于文件,即包下__init__.py,导入的本质就是导入该文件
        • 3、包A和包B下有同名模块也不会冲突,如A.a和B.b来自两个命名空间
        • 4、调用包,有时候要用到环境变量,注意一下环境变量是以执行文件为准的
        • 包的开发之注意事项:
          1、当模块的功能特别多的情况下,应该分文件管理
          2、每个模块之间为了避免后期模块改名的问题,可以使用相对导入(包里边的文件都应该是被导入的模块)
        • 环境变量注意事项:
          1、站在包的开发者。如果使用绝对路径来管理自己的模块,那么它是需要永远以包的路径为基准依次导入模块
          2、站在包的使用者。必须将包所在的那个文件夹路径添加到system path中(******)
      • logging模块(日志模块)
        • 如何使用
          import logging
          logging.debug('调试debug')​
          logging.info('消息info')
          logging.warning('警告warn')
          logging.error('错误error')
          logging.critical('严重critical')
          ​
          '''打印结果
          WARNING:root:警告warn
          ERROR:root:错误error
          CRITICAL:root:严重critical
          '''

        • 可在logging.basicConfig()函数中通过具体参数来更改logging模块默认行为
          import logging
          logging.basicConfig(filename='access.log',
                              format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S %p',
                              level=30,
                              )
          ​
          logging.debug('debug日志')  # 10
          logging.info('info日志')  # 20
          logging.warning('warning日志')  # 30
          logging.error('error日志')  # 40
          logging.critical('critical日志')  # 50

        • 日志形成的内部机制和步骤
          1.logger对象:负责产生日志
          2.filter对象:过滤日志(了解)
          3.handler对象:控制日志输出的位置(文件/终端)
          4.formmater对象:规定日志内容的格式

        • 举例说明日志形成过程
          import logging
          ​
          # 1.logger对象:负责产生日志
          logger = logging.getLogger('转账记录')
          ​
          # 2.filter对象:过滤日志(了解)
          ​
          # 3.handler对象:控制日志输出的位置(文件/终端)
          hd1 = logging.FileHandler('a1.log',encoding='utf-8')  # 输出到文件中
          hd2 = logging.FileHandler('a2.log',encoding='utf-8')  # 输出到文件中
          hd3 = logging.StreamHandler()  # 输出到终端
          ​
          # 4.formmater对象:规定日志内容的格式
          fm1 = logging.Formatter(
                  fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                  datefmt='%Y-%m-%d %H:%M:%S %p',
          )
          fm2 = logging.Formatter(
                  fmt='%(asctime)s - %(name)s:  %(message)s',
                  datefmt='%Y-%m-%d',
          )
          ​
          # 5.给logger对象绑定handler对象
          logger.addHandler(hd1)
          logger.addHandler(hd2)
          logger.addHandler(hd3)
          ​
          # 6.给handler绑定formmate对象
          hd1.setFormatter(fm1)
          hd2.setFormatter(fm2)
          hd3.setFormatter(fm1)
          ​
          # 7.设置日志等级
          logger.setLevel(20)
          ​
          # 8.记录日志
          logger.debug('写了半天 好累啊 好热啊 好想释放')
        • hashlib模块
        • 定义
          hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
        • hash值的特点是:
          1、只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
          2、不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
          3、只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
        • 关于加密
          1.不同的算法 使用方法是相同的
          密文的长度越长 内部对应的算法越复杂
          但是
              1.时间消耗越长
              2.占用空间更大
          通常情况下使用md5算法 就可以足够了
        • hashlib模块应用场景
          1.密码的密文存储
          2.校验文件内容是否一致
        • 加盐处理
          • 定义:在每一个需要加密的数据之前 先手动添加一些内容
            # 加盐处理
            # import hashlib
            #
            # md = hashlib.md5()
            # # 公司自己在每一个需要加密的数据之前 先手动添加一些内容
            # md.update(b'oldboy.com')  # 加盐处理
            # md.update(b'hello')  # 真正的内容
            # print(md.hexdigest())  # 返回摘要,作为十六进制数据字符串值
          • 加盐的原因:
            为了避免用户的简单密码可以被轻易识别, ​
            在生成摘要时, 我们可以加点作料.作料可以是一个固定的字符串, ​
            也可以是一个根据用户不同的随机字符串.​
            如果是随机字符串的话, 这个随机字符串也需要被存储在服务器中.
        • 动态加盐
          • 定义:就是将加盐操作写成函数,每次加盐操作的时候,直接调用函数
            import hashlib
            def get_md5(data):
                md = hashlib.md5()
                md.update('加盐'.encode('utf-8'))
                md.update(data.encode('utf-8'))
                return md.hexdigest()
            password = input('password>>>:')
            res = get_md5(password)
            print(res)
      • openpyxl模块
        • office版本常识
          03版本之前,Excel文件后缀名叫
        • 操作Excel的模块
          xlwd 写;excelxlrt 读
          excelxlwd和xlrt既支持03版本之前的excel文件,也支持03版本之后的excel文件
          openpyxl 只支持03版本之后的
        • 使用流程
          • 安装
            pip install openpyxl
          • 创建
            from  openpyxl import  Workbook 
            # 实例化
            wb = Workbook()
            # 激活 worksheet
            ws = wb.active
          • 打开已有
            >>> from openpyxl  import load_workbook
            >>> wb2 = load_workbook('文件名称.xlsx')
          • 存储数据
            # 方式一:数据可以直接分配到单元格中(可以输入公式)
            ws['A1'] = 42
            # 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
            ws.append([1, 2, 3])
            # 方式三:Python 类型会被自动转换
            ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
          • 创建表
            # 方式一:插入到最后(default)
            >>> ws1 = wb.create_sheet("Mysheet") 
            # 方式二:插入到最开始的位置,第二个参数是索引号
            >>> ws2 = wb.create_sheet("Mysheet", 0)
          • 选择表
            # sheet 名称可以作为 key 进行索引
            >>> ws3 = wb["New Title"]
            >>> ws4 = wb.get_sheet_by_name("New Title")
            >>> ws is ws3 is ws4
            True
          • 查看表
            # 显示所有表名
            >>> print(wb.sheetnames)
            ['Sheet2', 'New Title',  'Sheet1']
            # 遍历所有表
            >>> for sheet in  wb:
            ... 	print(sheet.title)
          • 访问单元格(call)
            • 单一单元格访问
              # 方法一
              >>> c = ws['A4']
              # 方法二:row 行;column 列
              >>> d = ws.cell(row=4, column=2, value=10)
              # 方法三:只要访问就创建
              >>> for i in  range(1,101):
              ...         for j in range(1,101):
              ...            ws.cell(row=i, column=j)
          • 保存数据
            >>> wb.save('文件名称.xlsx')
          • 删除工作表
            # 方式一
            wb.remove(sheet)
            # 方式二
            del wb[sheet]
      • 深浅拷贝
        • 字面理解
          浅拷贝指仅仅拷贝数据集合的第一层数据,
          深拷贝指拷贝数据集合的所有层。
          ​所以对于只有一层的数据集合来说深浅拷贝的意义是一样的,​比如字符串,数字,还有仅仅一层的字典、列表、元祖等
        • 内部原理
          深浅拷贝的本质是对于可变不可变类型,到底指的是原来还是自己
        • 方法
          导入模块:import copy
          浅拷贝:copy.copy
          深拷贝:copy.deepcopy
  • 相关阅读:
    Hackerrank alien-flowers(数学公式)
    Hackerrank manasa-and-combinatorics(数学推导)
    Codeforces 314B(倍增)
    Codeforces Round #403(div 2)
    Mutual Training for Wannafly Union #6
    几道splay
    高数(A)下 第十章
    Bestcoder #92
    codevs1700 施工方案第二季
    poj2631
  • 原文地址:https://www.cnblogs.com/buzaiyicheng/p/11216158.html
Copyright © 2020-2023  润新知