函数知识点 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)
深浅拷贝
原文地址:https://www.cnblogs.com/llx--20190411/p/11216213.html