zoukankan      html  css  js  c++  java
  • 包和一些常用模块

        • 回顾调用一个模块的过程:
          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
  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/buzaiyicheng/p/11216158.html
Copyright © 2011-2022 走看看