-
第一次班委会总结:
-
微调座位.
-
开展运维兴趣班.
-
培养独立思考问题的能力.
-
遇到难题 选做题:先思考20分钟左右.关键节点问问思路.
-
-
-
自定义模块
-
模块是什么?
-
为什么要有模块?
-
什么是脚本?
-
-
模块的分类
-
import的使用
-
第一次导入模块执行三件事
-
被导入模块有独立的名称空间
-
为模块起别名
-
导入多个模块
-
-
from ... import ...
-
from ... import ...的使用
-
from ... import ... 与import对比
-
一行导入多个
-
from ... import *
-
模块循环导入的问题
-
py文件的两种功能
-
模块的搜索路径
-
-
json pickle 模块
-
hashlib模块
-
-
具体内容
-
自定义模块
-
模块是什么?
为什么不行?
1. 代码太多,读取代码耗时太长.
-
代码不容易维护.
所以我们怎么样?
一个py文件拆分100文件,100个py文件又有相似相同的功能.冗余. 此时你要将100个py文件中相似相同的函数提取出来, input 功能,print()功能, time.time() os.path.....放在一个文件,当你想用这个功能拿来即用.类似于这个py文件: 常用的相似的功能集合.模块.
模块就是一个py文件常用的相似的功能集合.
-
-
为什么要有模块?
-
拿来主义,提高开发效率.
-
便于管理维护.
-
什么是脚本?
-
脚本就是py文件.长期保存代码的文件.
-
-
-
模块的分类
-
内置模块200种左右.Python解释器自带的模块,time os sys hashlib等等.
-
第三方模块6000种.一些大牛大神写的,非常好用的.
pip install 需要这个指令安装的模块,Beautiful_soup,request,Django,flask 等等.
-
自定义模块,自己写的一个py文件.
-
-
import的使用
import 模块 先要怎么样?
import tbjx 执行一次tbjx这个模块里面的所有代码,
第一次引用tbjx这个模块,会将这个模块里面的所有代码加载到内存,只要你的程序没有结束,接下来你在引用多少次,它会先从内存中寻找有没有此模块,如果已经加载到内存,就不在重复加载.
-
第一次导入模块执行三件事
***
-
在内存中创建一个以tbjx命名的名称空间.
-
执行此名称空间所有的可执行代码(将tbjx.py文件中所有的变量与值的对应关系加载到这个名称空间).
-
通过tbjx. 的方式引用模块里面的代码.
1 import tbjx 2 print(tbjx.name) 3 tbjx.read1()
-
-
被导入模块有独立的名称空间
***
1 import tbjx 2 # name = 'alex' 3 # print(name) 4 # print(tbjx.name) 5 6 # 7 # def read1(): 8 # print(666) 9 # tbjx.read1() 10 # 11 12 # name = '日天' 13 # tbjx.change() 14 # print(name) # 日天 15 # print(tbjx.name) # barry 16
-
为模块起别名
**
-
1 简单,便捷.
1 # import hfjksdahdsafkd as sm 2 # print(sm.name) 3
-
2,有利于代码的简化.
1 # 原始写法 2 # result = input('请输入') 3 # if result == 'mysql': 4 # import mysql1 5 # mysql1.mysql() 6 # elif result == 'oracle': 7 # import oracle1 8 # oracle1.oracle() 9 # list.index() 10 # str.index() 11 # tuple.index() 12 # 起别名 13 # result = input('请输入') 14 # if result == 'mysql': 15 # import mysql1 as sm 16 # elif result == 'oracle': 17 # import oracle1 as sm 18 # ''' 后面还有很多''' 19 # sm.db() # 统一接口,归一化思想 20
-
-
导入多个模块
1 import time, os, sys # 这样写不好 2 # 应该向以下这种写法: 3 import time 4 import os 5 import sys
-
-
from ... import ...
-
from ... import ...的使用
1 # from tbjx import name 2 # from tbjx import read1 3 # from tbjx import read2 4 # print(name) 5 # print(globals()) 6 # read1()
-
from ... import ... 与import对比
***
-
from.. import 用起来更方便
1 from tbjx import name 2 print(name)
-
from...import 容易与本文件的名字产生冲突.
1 # 1, 容易产生冲突,后者将前者覆盖 2 # name = 'alex' 3 # from tbjx import name 4 # print(name)
-
当前位置直接使用read1和read2,执行时,仍然以tbjx.py文件全局名称空间
***
1 # from tbjx import read1 2 # 3 # def read1(): 4 # print(666) 5 6 # name = '大壮' 7 # read1() 8 # print(globals()) 9 10 11 from tbjx import change 12 name = 'Alex' 13 print(name) # 'Alex' 14 change() # 'barry' 15 from tbjx import name 16 print(name)
-
-
一行导入多个
1 from tbjx import name,read1,read2 # 这样不好 2 from tbjx import name 3 from tbjx import read1
-
from ... import *
-
模块循环导入的问题
-
py文件的两种功能
py文件的两个功能:
-
自己用 脚本
-
被别人引用 模块使用
-
-
print('from the tbjx.py')
1 __all__ = ['name', 'read1'] # 配合*使用 2 3 name = '太白金星' 4 5 def read1(): 6 print('tbjx模块:', name)
def read2(): print('tbjx模块') read1()
1 def change(): 2 global name 3 name = 'barry' 4 print(name)
# print(name)
# 当tbjx.py做脚本: name == main 返回True
# 当tbjx.py做模块被别人引用时: name == tbjx1 # __name__ 根据文件的扮演的角色(脚本,模块)不同而得到不同的结果 2 #1, 模块需要调试时,加上 if __name__ == '__main__': 3 # import time 4 5 # change() # 测试代码 6 # if __name__ == '__main__': 7 # change() 8 9 # 2, 作为项目的启动文件需要用. 10 ```
-
模块的搜索路径
***
1 # import sm 2 import abc 3 # python 解释器会自动将一些内置内容(内置函数,内置模块等等)加载到内存中 4 import sys 5 # print(sys.modules) # 内置内容(内置函数,内置模块等等) 6 import time 7 8 # print(sys.path) 9 #['D:\python_22\day17', 'C:\Python\Python36\python36.zip', 'C:\Python\Python36\DLLs', 'C:\Python\Python36\lib', 'C:\Python\Python36', 'C:\Python\Python36\lib\site-packages'] 10 # 'D:\python_22\day17' 路径是当前执行文件的相对路径 11 # import tbjx 12 13 # 我就想找到dz 内存没有,内置中,这两个你左右不了,sys.path你可以操作. 14 import sys 15 sys.path.append(r'D:python_22day16') 16 # sys.path 会自动将你的 当前目录的路径加载到列表中. 17 import dz 18 19 # 如果你想要引用你自定义的模块: 20 # 要不你就将这个模块放到当前目录下面,要不你就手动添加到sys.path
-
import sm
-
它会先从内存中寻找有没有已经存在的以sm命名的名称空间.
-
它会从内置的模块中找. time,sys,os,等等.
-
他从sys.path中寻找.
-
-
json pickle 模块
-
序列化模块: 将一种数据结构(list,tuple,dict ....)转化成特殊的序列.
为什么存在序列化?
数据 ----> bytes
只有字符串类型和bytes可以互换.
dict,list..... -------> str <--------> bytes
数据存储在文件中,str(bytes类型)形式存储,比如字典.
数据通过网络传输(bytes类型),str 不能还原回去.
特殊的字符串:序列化.
序列化模块:
json模块 : (重点)
-
不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
-
json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None
1 l1 = [i for i in range(10000)] 2 # l1 --->bytes 3 # b1 = l1.encode('utf-8') # 不能直接转换 4 # l1转化成字符串在转化成bytes 5 s1 = str(l1) 6 b1 = s1.encode('utf-8') 7 # print(b1) 8 9 # 岑哥接收了b1 10 s2 = b1.decode('utf-8') 11 # print(s2,type(s2)) 12 13 # str 我们学过的str 14 15 # dic = {'username': '太白', 'password': 123,'status': True} 16 import json 17 #dumps loads 主要用于网络传输,但是也可以读写文件 18 # 特殊的字符串 19 # st = json.dumps(dic,ensure_ascii=False) 20 # print(st,type(st)) 21 # # 反转回去 22 # dic1 = json.loads(st) 23 # print(dic1,type(dic1)) 24 25 # 写入文件 26 # l1 = [1, 2, 3, {'name': 'alex'}] 27 # 转化成特殊的字符串写入文件 28 # with open('json文件',encoding='utf-8',mode='w') as f1: 29 # st = json.dumps(l1) 30 # f1.write(st) 31 32 # 读取出来还原回去 33 # with open('json文件',encoding='utf-8') as f2: 34 # st = f2.read() 35 # l1 = json.loads(st) 36 # print(l1,type(l1)) 37 # 特殊的参数 38 l1 = [1, 2, 3, {'name': 'alex'}] 39 40 # dump load 只能写入文件,只能写入一个数据结构 41 # with open('json文件1',encoding='utf-8',mode='w') as f1: 42 # json.dump(l1,f1) 43 44 # 读取数据 45 # with open('json文件1',encoding='utf-8') as f2: 46 # l1 = json.load(f2) 47 # print(l1,type(l1)) 48 49 50 # 一次写入文件多个数据怎么做? 51 52 # 错误示例: 53 # dic1 = {'username': 'alex'} 54 # dic2 = {'username': '太白'} 55 # dic3 = {'username': '大壮'} 56 # with open('json文件1',encoding='utf-8',mode='w') as f1: 57 # json.dump(dic1,f1) 58 # json.dump(dic2,f1) 59 # json.dump(dic3,f1) 60 61 62 # 读取数据 63 # with open('json文件1',encoding='utf-8') as f1: 64 # print(json.load(f1)) 65 # print(json.load(f1)) 66 # print(json.load(f1)) 67 68 69 # 正确写法: 70 dic1 = {'username': 'alex'} 71 dic2 = {'username': '太白'} 72 dic3 = {'username': '大壮'} 73 # with open('json文件1',encoding='utf-8',mode='w') as f1: 74 # f1.write(json.dumps(dic1) + ' ') 75 # f1.write(json.dumps(dic2) + ' ') 76 # f1.write(json.dumps(dic3) + ' ') 77 78 # with open('json文件1',encoding='utf-8') as f1: 79 # for i in f1: 80 # print(json.loads(i))
pickle模块:
-
只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
-
支持Python所有的数据类型包括实例化对象。
1 l1 = [1, 2, 3, {'name': 'alex'}] 2 3 # dumps loads 只能用于网络传输 4 # import pickle 5 # st = pickle.dumps(l1) 6 # print(st) # bytes 7 # 8 # l2 = pickle.loads(st) 9 # print(l2,type(l2)) 10 11 # dump load 直接写入文件 12 # import pickle 13 # dic1 = {'name':'oldboy1'} 14 # dic2 = {'name':'oldboy2'} 15 # dic3 = {'name':'oldboy3'} 16 # 17 # f = open('pick多数据',mode='wb') 18 # pickle.dump(dic1,f) 19 # pickle.dump(dic2,f) 20 # pickle.dump(dic3,f) 21 # f.close() 22 # import pickle 23 # f = open('pick多数据',mode='rb') 24 # print(pickle.load(f)) 25 # print(pickle.load(f)) 26 # print(pickle.load(f)) 27 # f.close() 28 29 import pickle 30 def func(): 31 print('in func') 32 33 # f = open('pick对象',mode='wb') 34 # pickle.dump(func,f) 35 # f.close() 36 37 # f = open('pick对象', mode='rb') 38 # ret = pickle.load(f) 39 # print(ret) 40 # ret() 41
-
hashlib模块
包含很多的加密算法. MD5, sha1 sha256 sha512......
用途:
-
密码加密.不能以明文的形式存储密码.密文的形式.
-
文件的校验.
用法:
-
将bytes类型字节 转化成 固定长度的16进制数字组成的字符串.
-
不同的bytes利用相同的算法(MD5)转化成的结果一定不同.
-
相同的bytes利用相同的算法(MD5)转化成的结果一定相同.
-
hashlib算法不可逆(MD5中国王晓云破解了).
-
1 # import hashlib 2 # hashlib.md5() 3 4 # md5 5 # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育' 6 # import hashlib 7 # ret = hashlib.md5() 8 # ret.update(s1.encode('utf-8')) 9 # print(ret.hexdigest(),) 10 11 # 相关练习 12 import hashlib 13 # def MD5(pwd): 14 # ret = hashlib.md5() 15 # ret.update(pwd.encode('utf-8')) 16 # return ret.hexdigest() 17 # 18 # 19 # def register(): 20 # username = input('请输入用户名:').strip() 21 # password = input('请输入密码:').strip() 22 # password_md5 = MD5(password) 23 # with open('register',encoding='utf-8',mode='a') as f1: 24 # f1.write(f' {username}|{password_md5}') 25 # 26 # register() 27 # 28 # def login(): 29 # username = input('请输入用户名:').strip() 30 # password = input('请输入密码:').strip() 31 # password_md5 = MD5(password) 32 # 33 34 # 普通加密 35 36 import hashlib 37 # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育' 38 # s2 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育' 39 # ret = hashlib.md5() 40 # ret.update(s2.encode('utf-8')) 41 # print(ret.hexdigest()) # 18f127c24462dd59287798ea5c0c0c2f 18f127c24462dd59287798ea5c0c0c2f 42 # 123456: 18f127c24462dd59258898ea5c0c0c2f 43 # 000000: 18f127c24462dd59258898we5c0c0c2f 44 45 # s2 = '19890425' 46 # ret = hashlib.md5() 47 # ret.update(s2.encode('utf-8')) 48 # print(ret.hexdigest()) # 6e942d04cf7ceeeba09e3f2c7c03dc44 49 50 # 加盐 51 52 # s2 = '19890425' 53 # ret = hashlib.md5('太白金星'.encode('utf-8')) 54 # ret.update(s2.encode('utf-8')) 55 # print(ret.hexdigest()) # 84c31bbb6f6f494fb12beeb7de4777e1 56 57 58 # 动态的盐 59 # s2 = '19890425' 60 # ret = hashlib.md5('太白金星'[::2].encode('utf-8')) 61 # ret.update(s2.encode('utf-8')) 62 # print(ret.hexdigest()) # 84c31bbb6f6f494fb12beeb7de4777e1 63 64 65 # sha系列 金融类,安全类.用这个级别. 66 # 随着sha系列数字越高,加密越复杂,越不易破解,但是耗时越长. 67 # s2 = '198fdsl;fdsklgfjsdlgdsjlfkjsdalfksjdal90425' 68 # ret = hashlib.sha3_512() 69 # ret.update(s2.encode('utf-8')) 70 # print(ret.hexdigest()) # 4d623c6701995c989f400f7e7eef0c4fd4ff15194751f5cb7fb812c7d42a7406ca0349ea3447d245ca29b48a941e2f2f66579fb090babb73eb2b446391a8e102 71 72 73 74 # 文件的校验 75 76 # linux中一切皆文件: 文本文件,非文本文件,音频,视频,图片.... 77 # 无论你下载的视频,还是软件(国外的软件),往往都会有一个md5值 78 79 80 # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6 *pycharm-professional-2019.1.2.exe 81 82 # s1 = '我叫太白金星 今年18岁' 83 # ret = hashlib.sha256() 84 # ret.update(s1.encode('utf-8')) 85 # print(ret.hexdigest()) # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc 86 # 87 # ret = hashlib.sha256() 88 # ret.update('我叫'.encode('utf-8')) 89 # ret.update('太白金星'.encode('utf-8')) 90 # ret.update(' 今年'.encode('utf-8')) 91 # ret.update('18岁'.encode('utf-8')) 92 # print(ret.hexdigest()) # 54fab159ad8f0bfc5df726a70332f111c2c54d31849fb1e4dc1fcc176e9e4cdc 93 94 # low版校验: 95 def file_md5(path): 96 ret = hashlib.sha256() 97 with open(path,mode='rb') as f1: 98 b1 = f1.read() 99 # print(b1) 100 ret.update(b1) 101 return ret.hexdigest() 102 result = file_md5('pycharm-professional-2019.1.2.exe') 103 print(result) # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6 104 105 # 高大上版
-
今日总结
-
import 三件事, import的名字如果调用? 模块名.的方式调用.
-
from ... import ... 容易产生冲突,独立的空间.
-
__name__
问题 -
模块的搜索路径
内存 内置 sys.path
-
序列化模块:
-
json最最常用(两对四个方法就行) 一定要掌握
-
pickle(两对四个方法就行) 尽量掌握
-
-
hashlib
-
密码的加密 ,文件的校验
-
-
-
预习内容
规范化目录结构