Python第17天

今日内容大纲

1 自定义模块

  模块:

    抖音:20万行代码全部放在一个py文件中?

    为什么不行?

      1.代码太多,读取代码耗时太长

      2.代码不容易维护,

    所以我们怎么样?

    一个py文件拆分100文件,100个py文件又有相似相同的功能。、冗余,此时你要将100个py文件中相似相同的函数提取出来,input功能,print()功能,time.time()。os.path放在一个文件,当你想用这个功能拿来即用,类似于这个py文件:常用的相似的功能集合模块

模块就是一个py文件,常用的相似的功能集合

 

2 为什么要有模块

  拿来主义,提高开发效率

  便于管理维护

  什么是脚本?

    脚本就是py文件,长期保存代码的文件

4 模块的分类

  1 内置模块 200种左右 Python解释器自定的模块,time OS SYS  hashlib等等

  2 第三方模块 ,一些大神写的,非常好用的。pip install  需要这个指令安装的模块,Beautiful_soup,request,django   flask 等等  6000等

  3  自定义模块   自己写的一个py 文件

 

5 import的使用

  import 模块 先要怎么样?

  import  tbjx  执行一次tbjx 这个模块里面的所有代码

print(111)
import tbjx
print(222)

111
from the tbjx.py
666
222

第一次引用tbjx 这个模块,会将这个模块里面的所有代码加载到内存,只要你的程序没有结束,接下来你在引用多少次,他会先

从内存中查找有没有此模块,如果已将加载到内存了,就不重复加载

  第一次导入模块,发生了三件事情

    1 在内存中创建一个以tbjx  命名的名称空间

    2 执行此名称空间所有的可执行的代码(将tbjx.py文件中所有的变量与值的对应关系加载到这个名称空间)

    3 通过tbjx。的方式引用模块里面的代码(调用此模块的内容:变量,函数名,类名。。。)

 

import tbjx
print(tbjx.name)

from the tbjx.py
666
太白金星

 

 

 

  

   导入模块的文件是自己的名称空间     被导入的模块有独立的名称空间

  

#tbjx.py
print('from the tbjx.py')
name='太白金星'

def read1():
print('tbjx模块:',name)

def read2():
print('tbjx模块')
read1()

def change():
global name
name = 'barry'

print(666)


# from the tbjx.py
# 666
# 太白金星

import tbjx
# tbjx.read1()
# name='alex'
# print(name)
# print(tbjx.name)
# from the tbjx.py
# 666
# tbjx模块: 太白金星
# alex
# 太白金星


# def read1():
# print(666)
# tbjx.read1()
# from the tbjx.py
# 666
# tbjx模块: 太白金星

name='日天'
tbjx.change()
print(name)
print(tbjx.name)

# from the tbjx.py
# 666
# tbjx模块: 太白金星

 

 

 

   为模块起别名

    1 简单,便捷

    2 有利于代码的简化

    

 

# result=input('qingshuru')
# if result == 'mysql':
# import mysql1
# mysql1.mysql()
# elif result == 'oricle':
# import oricle1
# oricle1.oricle()


result = input('qingshuriu:')
if result == 'mysql':
import mysql1 as sm
elif result == 'oricle':
import oricle1 as sm


from import


from tbjx import name
from tbjx import read1
print(name)
print(globals())

 

 

 

 

 import和from   import 的对比

  1 from   import  用起来更方便

  2 from   import   容易与本文件的名字产生冲突   后者将前者覆盖

   

 

 

 

# from tbjx import name
# from tbjx import read1
# print(name)
# print(globals())

# name='alex'
# from tbjx import name
#
# print(name)

from tbjx import change
name='alex'
print(name)
change()
from tbjx import name
print(name)
# def read1():
# # print(666)
# name='dazhuang'
# read1()

 

 

 

3 当前位置使用read1和read2,执行时,仍然以tbjx.py文件全局名称空间

 

 

一行导入多个

from   tbjx   import   name,read1,read2  不好

from tbjx import name 

from tbjx import tead1

 

 

from tbjx   import *

__all__=['','']与*配合使用  在被调用个模块中

 

 

py文件的两个功能

  1 要么自己使用   脚本   --name-- ==__main__

  2要么被调用     模块使用   当tbjx.py被别引用时:__name__==tbjx

if  __name__=‘main‘’

 

——name---根据文件扮演的角色(脚本、模块)不同而得到不同的结果

  1 模块需要调试时,加上if  __name__=‘main‘’

  2作为项目的启动文件需要用

 

 

模块的搜索路径

  import  SM

  1 他会先从内存中寻找有没有已经存在的以sm命名名称空间

  2 他会从内置的模块中找,os sys  time等

  3 他会从sys.path中去找

内存中没有,内置没有,只能操作sys.path

import sys
sys.path.append(r'C:\Users\Administrator\Desktop\.idea\python1\aa')下划线是另一个文件的路径, append追加

sys.path会自动将你的当前目录的路径加载到列表中,自定义的模块,如果要引用自己自定义模块

  将这个模块放到当前目录下面,要不就手动添加到sys.path中

 

总结:

  import    模块    三件事 ,import的名字如何调用,模块名。的方式调用

  from    import   用起来方便容易与本文件产生冲突

  from  模块  import  的使用

      当前位置直接使用read1和read2,执行时,仍然以tbjx .py  文件全局名称空间

  

7  json   pickle  模块

  序列化模块:将一种数据结构(list  tuple  dict。。。)转化成特殊的序列。

  为什么存在序列化?

数据------》bytes

只用字符串类型和bytes可以互换

dicti ,list。。。-----》str 《---------------》bytes

数据存储在文件中,str形式存储,比如字典

数据通过网络传输(bytes类型),str不能还原回去

特殊的字符串:序列化

序列化模块:

  1 json( 重点)

   

  2pickle

  

  json:将数据结构转化成特殊的字符串,并且可以反转 

  两对四种方法

  网络传输:dumps     loads  主要是用于网络传输   但是也可以读写文件

dic={'name':'taibai'}
import json
st =json.dumps(dic,ensure_ascii=False)
print(st,type(st))

dic1=json.loads(st)
print(dic1,type(dic1))


写入文件
with open('json2',encoding='utf-8') as f2:
st=f2.read()
l1=json.loads(st)
print(l1,type(l1))

dump load只能写入文件,只能写入一个数据结构

l1=[1,2,3,{'name':'alex'}]
# with open('json3',encoding='utf-8',mode='w') as f1:
# json.dump(l1,f1)

with open('json2',encoding='utf-8') as f1:
l1=json.load(f1)
print(l1,type(l1))


#正确写法
dic1={'name':'alex'}
dic2={'name':'taib'}
dic3={'name':'dazhuang'}
# with open('json2',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('json2',encoding='utf-8') as f1:
for i in f1:
print(json.loads(i))


pickle 只有Python才有的

#
# l1=[1,2,3,{'name':'alex'}]

#dumps loads 只能用于网络传输
# import pickle
# st=pickle.dumps(l1)
# print(st)
#
# l2=pickle.loads(st)
# print(l2,type(l2))

#dump load用于写入文件
import pickle
# dic1={'name':'oldboy1'}
# dic2={'name':'oldboy2'}
# dic3={'name':'oldboy3'}
#
# f=open('pick_duoshujv',mode='wb')
# pickle.dump(dic1,f)
# pickle.dump(dic2,f)
# pickle.dump(dic3,f)
# f.close()

# f=open('pickduoshujv',mode='rb')
# print(pickle.load(f))
# print(pickle.load(f))
# print(pickle.load(f))
# f.close()

def func():
print('in func')

# f=open('pickduxiang',mode='wb')
# pickle.dump(func,f)
# f.close()

f=open('pickduxiang',mode='rb')
ret=pickle.load(f)
f.close()


8 hashlib模块


加密模块:包含很多的加密算法,MD5 , sha系列256 512 
用途:
  1 密码加密,不能以明文的形式存储密码,密文的形式
  2 文件的校验

用法:
  1 将bytes类型字符转化成固定长度的16进制数字组成的字符串
  2 不同的bytes利用相同的算法(MD5)转化成的结果一定不同
  3 相同的bytes类型利用相同的算法(MD5)转化陈的结果一定相同
  4 hashlib 算法不可逆
  
# import hashlib
# def MD5(pwd):
# ret=hashlib.md5()
# ret.update(pwd.encode('utf-8'))
# return ret.hexdigest()
# def register():
# username=input('qingshuru:').strip()
# password=input('qingshuru:').strip()
# password_md5=MD5(password)
# with open('register',encoding='utf-8',mode='a') as f1:
# f1.write(f'\n{username}|{password_md5}')
# register()
# def login():
# uersname=input('qingshuru:').strip()
# password=input('qingshuru:').strip()
# password_md5=MD5(password)
# login()
普通的加密

#普通的加密
  1 开机
  2 加载内容
  3 加密

import hashlib
s1='kdkkkkddkkddffff'
ret=hashlib.md5()开机
ret.update(s1.encode('utf-8'))加内容
print(ret.hexdigest())#6dae21d1fb8e209d2ba728136a15acb1加密


加盐(过程复杂)
#加盐
import hashlib
s1='19890425'
ret=hashlib.md5('taibai'.encode('utf-8'))
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())

动态的盐

#动态的加盐
import hashlib
s1='19890425'
ret=hashlib.md5('taibai'[::2].encode('utf-8'))
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())

sha系列
一般公司用不到,只有金融类 安全类用

#sha系列
#随着sha系列数字越高,加密越复杂,但是耗时越长
s1='ssddddddllllllllllfdfdfffffffffff'
ret=hashlib.sha3_512()
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())

文件的校验

linux中一切都是文件:文本文件 非文本文件 音频 视频图片。。。
无论你下载的视频,还是软件(国外的软件)往往都会有一个MD5值








今日总结

  1 import 三件事 import 的名字如果调用,模块名。的方式调用
  2 from 。。。 import 容易产生冲突,独立的空间
  3 --name--问题
  4 模块的搜索路径
    内存 内置 SYS。path
  5 序列化模块:json 最常用的(两对四个方法) 一定掌握 pickle
  6 hashlib


    1 MD5值
    2 文件的校验



    

































 

 

 

 

  

 

posted @ 2020-05-19 09:21  daoda  阅读(200)  评论(0)    收藏  举报