12,自定义模块(2)

1,自定义模块的补充

创建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(name)



# print(__name__)     # 根据文件的角色(脚本,模块)不同返回的值不同
# 当tbjx.py做脚本时:__name__ = __main__   返回True
# 当tbjx.py做模块被别人引用时:__name__ = tbjx


# __name__根据文件根据文件的角色(脚本,模块)不同返回的值不同
# 1,模块需要调试时加上if __name__ == '__main__':
# change()        # 测试代码  在脚本里用会输出barry,在模块里还是会输出barry.
# if __name__ == '__main__':      # 此时change()只会在脚本里执行,不会再模块里执行
#     change()
# 2,作为项目的启动文件时需要。
# 第一次导入模块发生三件事情
'''
 在内存在创建一个以tbjx命名的名称空间。
 执行此名称空间所有的可执行代码(将tbjx.py文件中所有变量与值的对用关系加载到这个名称空间)。
 通过tbjx.的方式引用模块里面的代码。

'''

test.py

import tbjx
tbjx.read2()
tbjx.read1()

# 第一次导入模块发生三件事情
'''
 在内存在创建一个以tbjx命名的名称空间。
 执行此名称空间所有的可执行代码(将tbjx.py文件中所有变量与值的对用关系加载到这个名称空间)。
 通过tbjx.的方式引用模块里面的代码。

'''

# 当前是tbjx.py

# import tbjx

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

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

name = '日天'
tbjx.change()        # barry
print(name)          # 日天
print(tbjx.name)     # barry
'''
from the tbjx.py
日天
barry
'''

import tbjx as sm       # 将tbjx更改名字为sm
print(sm.name)

起别名

     
将模块中的函数用同样的名称,就像index()函数可以在不用的数据类型情况下用相同的函数。

起别名的示例

模拟连接两个不同的数据库

创建两个py文件

mysql.py

# 原始方法:
def mysql():
    print('连接mysql模块')


# 统一接口化
def db():
    print('连接mysql模块')

oracle.py

# 原始方法
def oracle():
    print('连接oracle模块')


# 统一接口化
def db():
    print('连接oracle模块')

测试别名的文件

test2.py

# 原始方法

result = input('请输入要用的数据库:')
if result == 'mysql':
    import mysql1
    mysql1.db()
elif result == 'oracle':
    import oracle1
    oracle1.db()


# 起别名 统一接口化

result = input('请输入要用的数据库:')
if result == 'mysql':
    import mysql1 as sm
elif result == 'oracle':
    import oracle1 as sm
sm.db()          # 统一接口,归一化思想

统一接口归一化思想在以后的开发中尤为重要,不能将程序写死。

这里可能案例比较简单,看不出多大的区别。

2,from....import....

from...import... 与import使用的区别

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

 本文件和引入的模块在变量命名是注意产生冲突

1,容易产生冲突,后者将提前覆盖
# 1,容易产生冲突,后者将提前覆盖
name = 'alex'
from tbjx import name
print(name)     # name的位置不同,输出的值不同


from tbjx import read1

def read1():
    print(666)

read1()     # 666
2
from tbjx import read1
name = 'alex'
read1()     # tbjx模块: 太白金星
'''
def read1():
    print('tbjx模块:', name)
'''

def read1():
    print('本文件', name)

read1()
3
from tbjx import change
from tbjx import name
name = 'alex'
print(name)     # alex
change()        # barry
print(name)     # alex

注意使用

from tbjx import *
# 一般不这样写,如果要用必须将这个模块名中的名字全部记住
# __all__ = ['name', 'read1'] # 配合*使用 form tdjx import *是只能调用name和read1()  其他的单独引用还是可以使用的
# 但是可以配合__all__ 使用
print(name)
read1()

print(__name__)     # 根据文件的角色(脚本,模块)不同返回的值不同
# 当tbjx.py做脚本时:__name__ = __main__   返回True
# 当tbjx.py做模块被别人引用时:__name__ = tbjx


# __name__根据文件根据文件的角色(脚本,模块)不同返回的值不同
# 1,模块需要调试时加上if __name__ == '__main__':
change()        # 测试代码  在脚本里用会输出barry,在模块里还是会输出barry.
if __name__ == '__main__':      # 此时change()只会在脚本里执行,不会再模块里执行,||可以根据tbjx理解
    change()
# 2,作为项目的启动文件时需要。

print(__name__)


# 模块的搜索路径
import tbjx
print(tbjx.name)


import sys
print(sys.modules)      # 内置内容(内置函数,内置模块等等)
print(sys.path)     # 输出文件路径

# import dz           # 此时dz模块在09中和这个文件不在同一个文件夹下
# dz不在内存也不再内置,这两个都不能变唯一更变得就是路径,只有sys.parh可以操作
# print(dz)     # 报错
import sys

sys.path.append(r'D:\python 代码文件\python全栈学习\09-python装饰器')      # 在路径中添加dz模块所在的路径,然后再调用
# import dz

3,json模块

引入

# list--------->bytes
# b1 = list.encode('utf-8')     # 不能直接转换
# l1要先转化成字符串再转换成bytes
# l1要先转化成字符串再转换成bytes
s1 = str(l1)
b1 = s1.encode('utf-8')  # 进行编码
print(b1, type(b1))

# alex接收了b1
s2 = b1.decode('utf-8')  # 进行解码
print(s2, type(s2))

dumps,loads  用于网络传输,也可以读取文件

dic = {'username': '太白', 'password': 123, 'status': True}
#
import json

# dumps,loads  只能用于网络传输,但是也可以读取文件
# 编码成特殊的字符串
st = json.dumps(dic, ensure_ascii=False)
print(st, type(st))     # {"username": "太白", "password": 123, "status": true} <class 'str'>
# 反转回去
dic1 = json.loads(st)
print(dic1, type(dic1))     # {'username': '太白', 'password': 123, 'status': True} <class 'dict'>


l2 = [1, 2, 3, {'name':'alex'}]
# 转化成特殊字符串写入文件
with open('json文件', encoding='utf-8', mode='w') as f1:
    st = json.dumps(l2)
    f1.write(st)

# 将特殊字符串还原回去
with open('json文件', encoding='utf-8') as f2:
    st2 = f2.read()
    l2 = json.loads(st2)
    print(l2, type(l2))

dump load 用于写入,读取文件,只能写入一个数据结构

# dump load 只能用于写入,读取文件,只能写入一个数据结构
l3 = [1, 2, 3, {'name': 'alex'}]
with open('json1文件', encoding='utf-8', mode='w') as f1:
    json.dump(l3, f1)

# 读取数据
with open('json1文件',encoding='utf-8') as f2:
    l2 = json.load(f2)
    print(l2, type(l2))

一次写入多个数据

# 一次写入文件多个数据怎么做  用dumps和loads
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}
with open('json2文件', encoding='utf-8', mode='w') as f1:
    json.dump(dic1, f1)
    json.dump(dic2, f1)
    json.dump(dic3, f1)


# 读取数据
with open('json2文件',encoding='utf-8') as f2:
    print(json.load(f2))      # 只能读取一个报错


# 正确写法
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}
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 f2:
    for i in f2:
        print(json.loads(i))

4,hashlib模块

用途:
    1,密码加密。不能以明文的形式存储密码。以密文的形式。
    2,文件的校验。

1,数据加密

MD5
s1 = 'sfgjdfsbndfzbdfhfgjfgjkgfjndfgjesfghbsdfbfgsxdvzs老男孩教育'
s2 = '123'
import hashlib
ret = hashlib.md5()
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())

# 61aec2bc637b98e8112bec7a0808027c
# 202cb962ac59075b964b07152d234b70
普通加密
s1 = 'sfgjdfsbndfzbdfhfgjfgjkgfjndfgjesfghbsdfbfgsxdvzs老男孩教育'
import hashlib

ret = hashlib.md5()
print(ret)      # <md5 HASH object @ 0x00000188FE5A4570>
ret.update(s1.encode('utf-8'))
print(ret.hexdigest())      # 61aec2bc637b98e8112bec7a0808027c  长度永远不会变
加盐
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.md5('太白金星'.encode('utf-8'))       # '太白金星'.encode('utf-8') 这个称为盐,盐相同破译也非常的快
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())      # 9962c41a621de38dbc1f6ff00e38b299
动态加密
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.md5('太白金星'[::2].encode('utf-8'))
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())

练习
把输入的文件的密码加密
import hashlib


def MD5(pwd):
    ret = hashlib.md5()
    ret.update(pwd.encode('utf-8'))
    return ret.hexdigest()


def register():
    username = input('请输入用户名:').strip()
    passwprd = input('请输入密码:').strip()
    passwprd_md5 = MD5(passwprd)
    with open('加密文件',encoding='utf-8',mode='a') as f1:
        f1.write(f'\n{username} | {passwprd_md5}')

register()
sha系列
一般用不到,金融公司和安全公司可能会用
随着sha系列数字越高,加密越复杂,越不容易破解,耗时越长
s2 = 'sdfhndsfh'
import hashlib
ret = hashlib.sha512()
ret.update(s2.encode('utf-8'))
print(ret.hexdigest())
print(len(ret.hexdigest()))

数据加密是没有反向解密的,被破解是被试出来的,当我们登录账号忘记密码时,通过了身份验证后台为什么不直接告诉我们密码,而是让我们重新设置一个密码?。因为后台也不知道你的密码是多少,第一次设置密码时,后台将加密后的密码存到数据库中,以后每次登录输入的密码都会被相同的加密算法计算一遍,和数据库中的进行对比,加密后的字符串相同那密码正确,反之密码错误。这就是当我们登录账号忘记密码时,通过了身份验证后台为什么不直接告诉我们密码,而是让我们重新设置一个密码的原因。

2,文件校验

python中一切皆对象,Linux中一切皆文件:文本文件,非文本文件,音频,视频,图片
无论是下载的视频,还是软件(国外的软件),往往都会有md5值

以pycharm为例

进入下载页面可以看到一个SHA-256的校验码。

防止下载的软件被篡改,以及是否为官网下载的

校验方法:
def file_md5(path):
    ret = hashlib.md5()
    with open(path, mode='rb') as f1:
        b1 = f1.read()
        ret.update(b1)
    return ret.hexdigest()


result = file_md5('json文件')
print(result)  # 2e26d4ad39e63add4f129f9b2c8aa132c7c356f18b13ad1952bee37e88452bb5

校验软件,可以直接将软件复制到目录下,用rb的方式读取软件进行校验,得到的校验码和官网上的进行比较

5,pickle模块

pickle模块dumps loads 只能用于网络传输

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

# pickle模块dumps loads 只能用于网络传输
import pickle
st = pickle.dumps(l1)
print(st)       # b'\x80\x03]q\x00(K\x01K\x02K\x03}q\x01X\x04\x00\x00\x00nameq\x02X\x04\x00\x00\x00alexq\x03se.'


l2 = pickle.loads(st)
print(l2)       # [1, 2, 3, {'name': 'alex'}]

pickle模块dump load 只能用于文件写入

import pickle

# 文件写入
dic1 = {'name': 'alex1'}
dic2 = {'name': 'alex2'}
dic3 = {'name': 'alex3'}

f = open('pick多数据', mode='wb')
pickle.dump(dic1, f)
pickle.dump(dic2, f)
pickle.dump(dic3, f)
f.close()

# 文件读取
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)      # <function func at 0x000001E6B2A6AB88>
ret()       # in func

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

更多内容可以查看自己学python的过程,简单笔记。-CSDN博客

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值