函数知识点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‘[email protected]‘) 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)
深浅拷贝
原文地址:https://www.cnblogs.com/llx--20190411/p/11216213.html
时间: 2024-10-13 21:25:37