• 函数知识点 1.包 2.hashlib模块 --- 摘要算法模块 3.logging模块 4.openpyxl模块 5.深浅拷贝 # 17


    函数知识点
    1.包
     1 # coding(编码系统):utf-8
     2 """
     3 1.模块的三种来源:
     4     1.内置
     5     2.第三方
     6     3.自定义
     7 2.模块的四种表现形式:
     8     1.  .py文件
     9     2.共享文件
    10     3.包
    11     4.内置
    12 3.研究模块和包:
    13 # 还可以站在另外两个角度分析:
    14     1.模块的开发者
    15     2.模块的使用者
    16 4.导模块的那一瞬间发生了什么?
    17     首先运行执行文件run.py,创建一个run.py的名称空间
    18         1.执行文件md,创建一个md的名称空间
    19         2.把运行md得到的名字和内容存储到名称空间md中
    20         3.返回一个指向执行文件run的名字md(import md)/返回一个指向执行文件run的内容的值的名字money(from md impory money)
    21     多次导包不执行,沿用之前得到的结果
    22 """
    23 """
    24 包:
    25 1.定义:
    26     1.一系列模块文件的结合体,表现在外部即为文件夹
    27     2.这个包的内部通常具有一个__init__.py文件
    28 2.本质:依然是模块
    29 
    30 """
    31 """
    32 __init__.py
    33 # 我记自己的方法:
    34 # import os,sys
    35 # sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
    36 # from dir.dir1.dir11 import m1,m2,m3
    37 
    38 # 老师的方法:
    39 from dir.dir1.dir11.m2 import f2
    40 from dir.dir1.dir11.m1 import f1
    41 from dir.dir1.dir11.m3 import f3
    42 """
    43 from dir.dir1 import dir11
    44 # ps:在导入语句中 . 的左边肯定是一个包
    45 # 方法一:
    46 # dir11.m1.f1()  # from m1
    47 # dir11.m2.f2()  # from m2
    48 # dir11.m3.f3()  # from m3
    49 # 方法二
    50 dir11.f1()
    51 dir11.f2()
    52 dir11.f3()
    53 """
    54 # 导模块的那一瞬间,发生了什么?
    55 首先运行执行文件run.py,创建一个run.py的名称空间
    56         1.执行包,创建一个包下面的__init__.py的名称空间
    57         2.把运行包得到的名字和内容存储到名称空间__init__.py中
    58         3.返回一个指向执行文件run的名字settings
    59     多次导包不执行,沿用之前得到的结果
    60 """
    61 """
    62 3.研究模块和包:
    63 # 还可以站在另外两个角度分析:
    64     1.模块的开发者
    65     2.模块的使用者
    66 """
    67 """
    68 1.模块的开发者
    69 # 1.相对导入
    70     1.当模块的功能过多时,需要以文件的形式分类存储,方便管理
    71     2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块)
    72 # 2.绝对导入
    73     1.绝对导入要确认文件的路径,以包的路径为基准依次导入模块
    74     2.为确保路径导入正确,要提前把文件路径添加到环境变量中(sys.path.append)
    75 """
    76 """
    77 2.模块的使用者
    78 """
    79 """
    80 python2-python3导包的区别:
    81 Python2中导包必须有__init__.py文件,没有会报错
    82 python3 导包没有__init__文件,也不会报错,因为Python3自动为包创建了__init__文件,所以在删除不必要文件的时候,千万不要随意删除__init__文件
    83 """

    2.hashlib模块 --- 摘要算法模块
     1 """
     2 hashlib  加密模块
     3 
     4 """
     5 """
     6 格式:
     7 # 导模块
     8 import hashlib  # 这个加密的过程是无法解密的
     9 ## 1.生成一个帮你造密文的对象
    10 md = hashlib.md5()  
    11 ## 2.往对象里传明文数据  
    12 ps:
    13     1.update只能接受bytes类型的数据
    14     2.encode('utf-8') 转码
    15 md.update('hello'.encode('utf-8')) 
    16 ## 2.往对象里传明文数据  
    17 ps:
    18     1.update只能接受bytes类型的数据
    19     2.b''转码
    20 md.update(b'Jason_@.') 
    21 # 3.加盐
    22 md.update(b'dsfghljl;kl;;fdsrduytfuugiiui') 
    23 ## 4.获取加密数据
    24 # print(md.hexdigest()) 
    25 """
    26 # 撞库
    27 """
    28 1.不用的算法 使用方法是相同的
    29 密文的长度越长 内部对应的算法越复杂
    30 但是
    31     1.时间消耗越长
    32     2.占用空间更大
    33 通常情况下使用md5算法 就可以足够了
    34 """
    35 """
    36 ps:
    37 # 传入的内容 可以分多次传入 只要传入的内容相同 那么生成的密文肯定相同
    38 """
    39 # 函数版本
    40 """
    41 # 函数版本 ,加密加盐
    42 # 动态加盐,
    43     一般是把文件的名字或者CPU处理的时间,这些对象加进去,提高安全性
    44 """
    45 import hashlib
    46 def get_pwd(pwd):
    47 
    48     md5 = hashlib.md5()
    49     md5.update(b'hhhh123456hhh')
    50     md5.update(pwd.encode('utf-8'))
    51     md5.update(b'hhhj123456hgjhfghfhh')
    52     # md5.update(pwd.encode('utf-8'))
    53     return md5.hexdigest()
    54 pwd = input('pwd>>>:')
    55 print(get_pwd(pwd))
    56 
    57 """
    58 应用场景:
    59 1.密码的密文存储
    60 2.校验文件内容是否一致
    61 """
    hashlib 加密加盐


    3.logging模块
    两种日志方法:
     1 """
     2 日志模块:记录流水
     3 """
     4 import logging
     5 
     6 # 二.日志的格式
     7 # 1.文件 basicConfig 基本配置
     8 # 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=10,)
     9 # 2.终端
    10 # logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S %p',level=10,stream=True)
    11 
    12 # 一.日志的五个等级,等级类似于:地震的强度
    13 # # 1.走马观花,最不重要的信息
    14 # logging.debug('debug日志')  # 10
    15 # # 2.普通信息
    16 # logging.info('info日志')  # 20
    17 # # 3.警告信息
    18 # logging.warning('warning日志')  # 30
    19 # # 4.错误信息
    20 # logging.error('errorr日志')  # 40
    21 # # 5.严重错误信息
    22 # logging.critical('critical日志')  # 50
    23 
    24 """
    25 # 三.日志的四大成员--即四大对象
    26 # 1.logger 对象 负责生产日志
    27 # 2.filter 对象 过滤日志(了解) # 有好几层过滤
    28 # 3.handler 对象 控制日志输出的位置(文件/终端)
    29 # 4.formmater 对象 规定日志内容的格式
    30 """
    31 """
    32 ps:日志的配置字典.py
    33 
    34 """
    35 # 案例
    36 # 1.logger 对象 负责生产日志
    37 logger = logging.getLogger('转张记录')
    38 # print(logger)  # <Logger 转张记录 (WARNING)>
    39 
    40 # 2.filter 对象 过滤日志(了解)
    41 
    42 # 3.handler 对象 控制日志输出的位置(文件/终端)
    43 hd1 = logging.FileHandler('a1.log',encoding='utf-8')  # 输入到文件中
    44 hd2 = logging.FileHandler('a2.log',encoding='utf-8')  # 输出到文件中
    45 hd3 = logging.StreamHandler()  # 输出到终端
    46 # # 4.formmater 对象 规定日志内容的格式
    47 fm1 = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    48         datefmt='%Y-%m-%d %H:%M:%S %p',)
    49 fm2 = logging.Formatter(
    50         fmt='%(asctime)s - %(name)s:  %(message)s',
    51         datefmt='%Y-%m-%d',)
    52 
    53 # 5.给logger对象绑定handler对象
    54 logger.addHandler(hd1)
    55 logger.addHandler(hd2)
    56 logger.addHandler(hd3)
    57 # 6.给hander绑定formmate对象
    58 hd1.setFormatter(fm1)
    59 hd2.setFormatter(fm2)
    60 hd3.setFormatter(fm1)
    61 # 7.设置日志登记 Level 等级
    62 logger.setLevel(10)
    63 # 8.记录日志
    64 logger.debug('haofana,zhengshisble,nidayede aaaaaaaaaaaaaaaaaaaaaaa')
    65 
    66 # 值:2019-07-19 21:33:29 PM - 转张记录 - DEBUG -logging模块:  haofana,zhengshisble,nidayede aaaaaaaaaaaaaaaaaaaaaaa
    1.logging模块
     1 import os
     2 import logging.config   # 配置,布局
     3 """
     4 知识点1:日志输出的格式
     5 """
     6 # 定义三种日志输出的格式   # 开始
     7 # standart 标准格式
     8 standart_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
     9                   '[%(levelname)s][%(message)s]'  # name 为getlogger 指定的名字
    10 # simple 简单格式
    11 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    12 # 定义日志输出的格式   # 结束
    13 
    14 """
    15 # 知识点2
    16 下面的两个变量对应的值 需要你手动修改
    17 """
    18 # # log文件的目录
    19 logfile_dir = os.path.dirname(__file__)
    20 # log文件名
    21 logfile_name = 'a3.log'
    22 
    23 
    24 """
    25 # 知识点3
    26 # 如果不存在定义的日志目录就创建一个
    27 """
    28 # os.path.isdir 判断指定路径是否存在
    29 if not os.path.isdir(logfile_dir):
    30     # os.mkdir 创建新文件
    31     os.mkdir(logfile_dir)
    32 """
    33 知识点4
    34 log文件的全路径
    35 """
    36 # 把指定路径拼接到名字中
    37 logfile_path = os.path.join(logfile_dir,logfile_name)
    38 
    39 """
    40 知识点5
    41 log配置文件
    42 """
    43 LOGGING_DIC = {
    44     'version': 1,  # version版本
    45     'disable_existing_loggers': False,  # disable_existing_loggers 禁用现有记录器
    46     'formatters': {
    47         'standard': {
    48             'format': standart_format
    49         },  # format 格式
    50         'simple': {
    51             'format': simple_format
    52         },
    53     },
    54     'filters': {},  # 过滤日志
    55     'handlers': {
    56         #打印到终端的日志
    57         'console': {
    58             'level': 'DEBUG',
    59             'class': 'logging.StreamHandler',  # 打印到屏幕
    60             'formatter': 'simple'
    61         },
    62         #打印到文件的日志,收集info及以上的日志
    63         'default': {
    64             'level': 'DEBUG',
    65             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
    66             'formatter': 'standard',
    67             'filename': logfile_path,  # 日志文件
    68             'maxBytes': 1024*1024*5,  # 日志大小 5M
    69             'backupCount': 5,
    70             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
    71         },
    72     },
    73     'loggers': {
    74         #logging.getLogger(__name__)拿到的logger配置
    75         '': {
    76             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    77             'level': 'DEBUG',
    78             'propagate': True,  # 向上(更高level的logger)传递
    79         },  # 当键不存在的情况下 默认都会使用该k:v配置
    80     },
    81 }
    82 """
    83 知识点5
    84 使用日志字典配置
    85 """
    86 # 自动加载字典中的配置
    87 logging.config.dictConfig(LOGGING_DIC)
    88 # 负责生产日志
    89 logger1 = logging.getLogger('随机日志')
    90 # 记录日志
    91 logger1.debug('haoxiang偶啊没但是我不能加油坚持就是胜利')
    92 
    93 # 结果
    94 # 文件 a3.log
    95 # cmd
    96 # [DEBUG][2019-07-19 22:14:18,991][logging配置字典.py:91]haoxiang偶啊没但是我不能加油坚持就是胜利
    2.日志配置字典

    4.openpyxl模块
     1 """
     2 # 操作Excel表格读写
     3     03版本之前 excel文件的后缀名 叫xls
     4     03版本之后 excel文件的后缀名 叫xlsx
     5 """
     6 """
     7 方法一
     8     openpyxl模块  -- 近期比较火的操作 -- 只支持03版本之后
     9         1.写 
    10         from openpyxl import Workbook
    11         2.读
    12         from openpyxl import load_workbook
    13 方法二 及支持03版本之前,也支持03版本之后
    14     xlwd 写
    15     xlrt 读
    16 """
    17 #
    18 # from openpyxl import Workbook
    19 # # 1.先生成一个工作铺
    20 # wb = Workbook()
    21 # # 2.创建一个表单页,0 :后面可以通过数字控制位置
    22 # wb1 = wb.create_sheet('index',0)
    23 # wb2 = wb.create_sheet('index1')
    24 # # 3.创建标题,即表单页名称
    25 # # ps:后期可以通过表单页对象点title修改表单页名称
    26 # wb1.title = 'login'
    27 # # 4.单元格赋值
    28 # # wb1['A3'] = 666
    29 # # wb1['A4'] = 444
    30 # # # 5.按坐标复制 row 列 column 行
    31 # # wb1.cell(row=6,column=3,value=88888888)
    32 # # # sum()  总和
    33 # # wb1['A5'] = '=sum(A3:A4)'
    34 # # wb2['G6'] = 999
    35 # # 6.添加行标题
    36 # wb1.append(['username','age','hobby'])
    37 # # 7.行标题赋值
    38 # wb1.append(['jason',18,'study'])
    39 # wb1.append(['tank',72,'吃生蚝'])
    40 # wb1.append(['egon',84,'女教练'])
    41 # wb1.append(['sean',23,'会所'])
    42 # wb1.append(['nick',28,])
    43 # wb1.append(['nick','','秃头'])
    44 # # 8.保存新建的excel文件
    45 # wb.save('2test.xlsx')
    46 
    47 #
    48 from openpyxl import load_workbook
    49 # 1.添加指定工作簿声明  data 数据  仅仅读数据
    50 wb = load_workbook('2test.xlsx',read_only=True,data_only=True)
    51 # print(wb)  # <openpyxl.workbook.workbook.Workbook object at 0x000001E4E75D6AC8>
    52 # 2.打印表格页的名称  sheetnames 表格名字
    53 # print(wb.sheetnames)  # ['login', 'Sheet', 'index1']
    54 # print(wb['login']['A3'].value)  # tank
    55 # print(wb['login']['A4'].value)  # egon
    56 # print(wb['login']['A5'].value)  # sean
    57 # # ps:通过代码产生的excel表格必须经过人为操作之后才能读取出函数计算出来的结果值
    58 
    59 res = wb['login']
    60 # print(res)  # <openpyxl.worksheet._read_only.ReadOnlyWorksheet object at 0x00000283375ECA58>
    61 ge1 = res.rows
    62 for i in ge1:
    63     for j in i:
    64         print(j.value)
    操作表格

    5.深浅拷贝

     1 """
     2 深拷贝与浅考的区别:
     3 浅拷贝的本质:
     4 对于可变类型,浅拷配指向依然是原可变类型,子突然而然随之变化
     5 
     6 深拷配的本质:
     7 对于可变类型,他另外创建了一个栈区存储,可变类型内的不可变类型依然,指向不可变类型,原值发生重指向,而,深拷贝不变,故而,不影响深拷贝
     8 """
     9 import copy
    10 l = [1,2,[3,4]]
    11 l1 = l
    12 print(l1)  # [1, 2, [3, 4]]
    13 
    14 # 浅拷贝
    15 l2 = copy.copy(l)
    16 # 对可变类型做新增
    17 l2[2].append(666)
    18 print(l,l2) # [1, 2, [3, 4, 666]] [1, 2, [3, 4, 666]]
    19 # ps:对不可变类型无效,浅拷贝,不会随之变化,只针对可变类型
    20 
    21 # 深拷贝
    22 l3 = copy.deepcopy(l)
    23 # 对深拷贝的可变类型做小改
    24 l3[2].pop()
    25 print(l3,l)  # [1, 2, [3, 4]] [1, 2, [3, 4, 666]]
    26 # 不变类型,不会相互影响
    27 #
    28 l3[1]=111
    29 print(l3,l)
    深浅拷贝
  • 相关阅读:
    flink 使用processFunction函数的sideOutPut实现filter操作(java版)
    flink 状态编程之RichFlatMapFunction用法-java
    java flink之eventTime和window
    java spark sql 计算各个省份广告点击数的top3
    java spark 计算各个省份广告点击数的top3
    java streaming转换算子window,countByWindow
    java spark转换算子sortByKey
    java spark转换算子join、leftOuterJoin、rightOuterJoin、fullOuterjoin
    java spark转换算子groupByKey、reduceByKey、aggregateByKey
    java spark转换算子union、intersection、subtract
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11216213.html
Copyright © 2020-2023  润新知