模块
-
自定义模块
-
模块是什么?
抖音:40万行20万行代码全部放在一个py文件中?
为什么不行?
- 代码太多,读取代码耗时太长。
- 代码不易维护。
所以我们怎么样?
一个py文件拆分100个文件,100个py文件又具有相似相同的功能,冗余.此时你要将100个py文件中相似相同的函数提取出来, input 功能,print()功能, time.time() os.path.....放在一个文件,当你想用这个功能拿来即用,类似这个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.的方式引用模块里面的代码。
import tbjx print(tbjx.name) tbjx.read1()
-
被导入模块有独立的名称空间***
import tbjx # name = 'alex' # print(name) # print(tbjx.name) # # def read1(): # print(666) # tbjx.read1() # # name = '日天' # tbjx.change() # print(name) # 日天 # print(tbjx.name) # barry
-
-
为模块起别名**
-
- 简单,便捷
import hhhhhhadj as ho print(ho.name)
-
- 有利于代码的简化
# 原始写法 # result = input('请输入') # if result == 'mysql': # import mysql1 # mysql1.mysql() # elif result == 'oracle': # import oracle1 # oracle1.oracle() # list.index() # str.index() # tuple.index() # 起别名 result = input('请输入:') if result =='mysql': import mysql1 as sm elif result == 'oracle': import oracle1 as sm # ''' 后面还有很多''' # sm.db() # 统一接口,归一化思想
-
导入多个模块
import time,os,sys#这样写不好 #应该像下面这样写 import time import os import sys
-
-
-
from ... import...的使用
# from tbjx import name # from tbjx import read1 # from tbjx import read2 # print(name) # print(globals()) # read1()
-
from ... import ... 与import对比
***
- from.. import 用起来更方便
from tbjx import name print(name)
- from ...import 容易与本文件的名字产生冲突
容易产生冲突,后者将前者覆盖 # name = 'alex' # from tbjx import name # print(name)
- 当前位置直接使用read1和read2 ,执行时仍然以tbjx.py文件全局名称空间***
# from tbjx import read1 # # def read1(): # print(666) # name = '大壮' # read1() # print(globals()) from tbjx import change name = 'Alex' print(name) # 'Alex' change() # 'barry' from tbjx import name print(name)
-
一行导入多个
from tbjx import name,read1,read2 # 这样不好 from tbjx import name from tbjx import read1
-
from ... import *
-
模块循环导入的问题
-
py文件的两种功能
- 自己用脚本
- 被别人应用,模块使用
-
prrint('from the tbjx.py')
__all__ = ['name','read1']
name = '太白金星'
def read1():
print('tbjx模块:', name)
def read2() :print('tbjx模块') read1()
def change():
global name
name = 'holting'
print(name)
print(__name__)
当作为脚本: __name__ == __main__ 返回True
当作为模块: __name__ == 模块名
# __name__ 根据文件的扮演的角色(脚本,模块)不同而得到不同的结果
#1 模块需要调试时,加上 if __name__ =='__main__':
import time
change()#测试代码
if __name == '__main__':
change()
2 作为项目的启动文件需要用
- 模块的搜索路径***
import holting
import abc
#python 解释器会自动将一些内置内容(内置函数,内置模块等等)加载到内存中
import sys
print(sys.modules) # 内置内容(内置函数,内置模块等等)
import time
print(sys.path)
#['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']
# 'D:\\python_22\\day17' 路径是当前执行文件的相对路径
如果你想要引用你自定义的模块:
要不你就将这个模块放到当前目录下面,要不你就手动添加到sys.path
import sys
sys.path.append(r'D:\python_22\day1')
#sys.path 会将你的 当前目录的路径加载到列表中
import holting
- import holting
- 先从内存中寻找有没有已经存在的以 holting 命名的名称空间.
- 它会从内置的模块中找. 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,Ture,False,None
l1 = [i for i in range(10000)] # l1 --->bytes # b1 = l1.encode('utf-8') # 不能直接转换 #l1转化为字符串再转化成bytes s1 = str(l1) b1 = s1.encode('utf-8') print(b1) s2 = b1.decode('utf-8') print(s2,type(s2)) # dic = {'username': '太白', 'password': 123,'status': True} import json ## dumps loads 主要用于网络传输,但是也可以读写文件 特殊的字符串 st = json.dumps(dic,ensure_ascii=False)不使用ASCII print(st,type(st)) #反转回去 dic1 = json.loads(st) print(dic1,type(dic1)) import json # 写入文件 # l1 = [1, 2, 3, {'name': 'alex'}] # 转化成特殊的字符串写入文件 # with open('json文件',encoding='utf-8',mode='w') as f1: # st = json.dumps(l1) # f1.write(st) # 读取出来还原回去 # with open('json文件',encoding='utf-8') as f2: # st = f2.read() # l1 = json.loads(st) # print(l1,type(l1)) # 特殊的参数 # l1 = [1, 2, 3, {'name': 'alex'}] # #dump load 只能写入文件,只能写入一个数据结构 # with open('json文件1',encoding='utf-8',mode='w') as f1: # json.dump(l1,f1) # # #读取数据 # with open('json文件1',encoding='utf-8') as f2: # l1 = json.load(f2) # print(l1,type) #dump load 只能写入文件,只能写入一个数据结构 # 一次写入文件多个数据怎么做?dumps loads # 错误示例: # dic1 = {'username': 'alex'} # dic2 = {'username': '太白'} # dic3 = {'username': '大壮'} # with open('json文件1',encoding='utf-8',mode='w') as f1: # json.dump(dic1,f1) # json.dump(dic2,f1) # json.dump(dic3,f1) # 读取数据 # with open('json文件1',encoding='utf-8') as f1: # print(json.load(f1)) # print(json.load(f1)) # print(json.load(f1)) # 正确写法: dic1 = {'username': 'alex'} dic2 = {'username': '太白'} dic3 = {'username': '大壮'} with open('json文件1',encoding='utf-8',mode='w') as f1: f1.write(json.dumps(dic1) + '\n') f1.write(json.dumps(dic2) + '\n') f1.write(json.dumps(dic3) + '\n') with open('json文件1',encoding='utf-8') as f2: for i in f2: print(json.loads(i))
pickle 模块:
- 只能是Python 语言遵循的一种数据转化格式,只能在Python语言中使用。
- 支持Python 所有的数据类型包括实例化对象。
l1 = [1, 2, 3, {'name': 'alex'}] # dumps loads 只能用于网络传输 # import pickle # st = pickle.dumps(l1) # print(st) # bytes # # l2 = pickle.loads(st) # print(l2,type(l2)) # dump load 直接写入文件 # import pickle # dic1 = {'name':'oldboy1'} # dic2 = {'name':'oldboy2'} # dic3 = {'name':'oldboy3'} # # f = open('pick多数据',mode='wb') # pickle.dump(dic1,f) # pickle.dump(dic2,f) # pickle.dump(dic3,f) # f.close() # import pickle # f = open('pick多数据',mode='rb') # print(pickle.load(f)) # print(pickle.load(f)) # print(pickle.load(f)) # f.close() import pickle def func(): print('in func') # f = open('pick对象',mode='wb') # pickle.dump(func,f) # f.close() # f = open('pick对象', mode='rb') # ret = pickle.load(f) # print(ret) # ret()
-
hashlib模块
包含很多的加密算法,MD5,sha1,sha256 sha512......
用途:
- 密码加密,不能以明文的形式存储面,密文的形式
- 文件的校检
用法:
- 将bytes类型字节 转化成 固定的16进制数字组成的字符串
- 不同的bytes利用相同的算法(MD5)转化结果不一定相同
- 相同的bytes利用相同的算法(MD5)转化成的结果一定相同.
- hashlib算法不可逆(MD5中国王晓云破解了).
# import hashlib # s1 ='holting' # ret = hashlib.md5() # ret.update(s1.encode('utf-8')) # print(ret.hexdigest())#4172617e54212b022cb08dfc97ba9699 #相关练习 # import hashlib # def MD5(pwd): # ret = hashlib.md5() # ret.update(pwd.encode('utf-8')) # return ret.hexdigest() # def register(): # usename = input('请输入用户名:').strip() # password = input('请输入密码:').strip() # password_md5 = MD5(password) # with open('register',encoding='utf-8',mode='a') as f: # f.write(f'\n{usename}|{password}') # register() # def login(): # username = input('请输入用户名:').strip() # password = input('请输入密码:').strip() # password_md5 = MD5(password) #普通加密 import hashlib # s1 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育' # s2 = 'kfdslfjasdlfgjsdlgkhsdafkshdafjksdfsdkfhjsdafj老fhdskafhsdkjfdsa男孩教育' # ret = hashlib.md5() # ret.update(s1.encode('utf-8'))#18f127c24462dd59287798ea5c0c0c2f # print(ret.hexdigest()) # s2 = '19890425' # ret = hashlib.md5() # ret.update(s2.encode('utf-8')) # print(ret.hexdigest()) # 6e942d04cf7ceeeba09e3f2c7c03dc44 #加盐 s2 = '19890425' ret = hashlib.md5('holting'.encode('utf-8')) ret.update(s2.encode('utf-8')) print(ret.hexdigest()) # 5da2c13f97e5fe77150d1d7fad9a4813 #动态的盐 s2 = '19890425' ret = hashlib.md5('holting'[::2].encode('utf-8')) ret.update(s2.encode('utf-8')) print(ret.hexdigest()) # 709fc064795ec01c6869e01cd518df46 # sha系列 金融类,安全类.用这个级别. # 随着sha系列数字越高,加密越复杂,越不易破解,但是耗时越长. s2 = '198fdsl;fdsklgfjsdlgdsjlfkjsdalfksjdal90425' ret1 = hashlib.sha3_384() ret1.update(s2.encode('utf-8')) print(ret1.hexdigest())#60f72e38bb13b449c4cc8fe7882d3215fc6ae47e9e9e2fb571bae632bf1be14150625d2b802467eb5f74b482091962d2 # 文件的校验 # linux中一切皆文件: 文本文件,非文本文件,音频,视频,图片.... # 无论你下载的视频,还是软件(国外的软件),往往都会有一个md5值 # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6 *pycharm-professional-2019.1.2.exe s1 = '我叫holting 今年180岁' # rett = hashlib.sha3_224() # rett.update(s1.encode('utf-8')) # print(rett.hexdigest())#da1c778d08cf1b4479c5ff33813ff7341ac894fa7a4e5e7862a8b4bb rett = hashlib.sha3_224() rett.update('我叫'.encode('utf-8')) rett.update('holting 今年'.encode('utf-8')) rett.update('180岁'.encode('utf-8')) print(rett.hexdigest())#da1c778d08cf1b4479c5ff33813ff7341ac894fa7a4e5e7862a8b4bb #low版效验: def file_md5(path): rret = hashlib.sha256() with open(path,mode='rb') as f1: b1= f1.read() print(b1) ret.update(b1) return rret.hexdigest() result =file_md5('pycharm-professional-2019.1.2.exe') print(result) # 6217ce726fc8ccd48ec76e9f92d15feecd20422c30367c6dc8c222ab352a3ec6 # 高大上版