常用模块:

  • 须知:import 模块名 导入模块

random模块:

'''
random.random()  # 获取[0.0,1.0)范围内的一个浮点数
random.randint(a, b)  # 获取这个[a,b]区间范围内的一个整数
random.uniform(a, b)  # 获取[a,b]区间范围内的浮点数
random.shuffle(x)  # 把 参数指定的数据中的元素 打乱,参数必须是一个可变的数据类型
random.sample(x,k)  # 从x中随机抽取k个数据,组成一个列表返回
''‘
  • 练习
  • 把参数指定的数据中的元素 打乱 参数必须时一个可变的数据类型
  • 可变(不可哈希)的数据类型:list dict set -------修改后,原对象发生变化
    不可变(可哈希)的数据类型: str bool int tuple(元组) -----修改原对象,不会对原对象产生任何改变
lst = list(range(10))  # ---[0,1,2,3,4,5,6,7,8,9]

random.shuffle(lst)
print(lst)

+ 从x中随机抽取k个数据,组成一个列表返回

+ ```python
x = (1, 2, 3)
# 通过sample变相打乱
l = random.sample(x, len(x))
print(l)

time模块:

  • 封装了获取时间戳和字符串形式的时间的一些方法
  • 1.获取 时间戳
  • 时间戳:从时间元年(1970.1.1 00:00:00)到现在经过的秒数
print(time.time()) # 1581688611.4762974
  • 2.获取格式化时间对象:九个字段组成
  • 默认参数是当前系统的时间戳
print(time.gmtime())  # GMT:
# time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=13, tm_min=56, tm_sec=51, tm_wday=4, tm_yday=45, tm_isdst=0)
print(time.localtime())  # 当地时间
# time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=56, tm_sec=51, tm_wday=4, tm_yday=45, tm_isdst=0)
  • 3.时间元年过一秒后对应的时间对象
print(time.gmtime(1))
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)
  • 4.格式化时间对象和字符串之间的转换
  • 将时间对象转换成时间字符串
s = time.strftime("%Y %m %d %H:%M:%S")  # 年月日 时 分 秒
print(s)  # 2020 02 14 21:56:51
  • 5.把时间字符串转换成时间对象
time_obj = time.strptime('2010 10 10', '%Y %m %d')
print(time_obj)
# time.struct_time(tm_year=2010, tm_mon=10, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=283, tm_isdst=-1)
  • 时间对象 —> 时间戳
t1 = time.localtime()  # 时间对象
t2 = time.mktime(t1)  # 获取对应的时间戳
print(t2)  # 1581689092.0
时间对象,时间戳,时间字符串的表示方法
时间对象(结构化时间):time.struct_time(tm_year=2020, tm_mon=1, tm_mday=9, tm_hour=11, tm_min=16, tm_sec=47, tm_wday=3, tm_yday=9, tm_isdst=0)
时间戳:1578568607.0
时间字符串(格式化时间):2020 01 09 19:16:47
4.time.sleep(secs)
(线程)推迟指定的时间运行。单位为秒。

总结:

  • 如有问题,查看上述time模块
# # 格式化时间 ---->  结构化时间
# ft = time.strftime('%Y/%m/%d %H:%M:%S')
# print(ft)  # 2020/02/14 21:49:14
# st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
# print(st)  # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=49, tm_sec=14, tm_wday=4, tm_yday=45, tm_isdst=-1)
# # 结构化时间 ---> 时间戳
# t = time.mktime(st)
# print(t)  # 1581688154.0
#
# # 时间戳 ----> 结构化时间
# t = time.time()
# st = time.localtime(t)
# print(st)  # time.struct_time(tm_year=2020, tm_mon=2, tm_mday=14, tm_hour=21, tm_min=49, tm_sec=14, tm_wday=4, tm_yday=45, tm_isdst=0)
# # 结构化时间 ---> 格式化时间
# ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
# print(ft)  # 2020/02/15 21:56:08

序列化模块

json模块

  • JavaScript Object Notation:Java脚本对象标记语言-----将大部分数据类型变成字符串,但集合(set)不可以
  • 已经成为一种简单的数据交换格式
  • 不完全的序列化----转化成 字符串的数据类型

1.json.dumps从内存到内存,在可转的情况下转化成字符串类型

  • 列表序列化
s = json.dumps([1, 2, 3])
print(type(s))  # <class 'str'>  把指定的对象转换成json格式的字符串
print(s)  # 输出[1, 2, 3]     实际上'[1, 2,  3]'
  • 元组可以json序列化,序列化后变成列表,但数据类型使字符串
s = json.dumps((1,2, 3))
print(s)  # [1, 2, 3]---------字符串类型   <class 'str'>

res = json.dumps(10)
print(res)  # 10 -----'10'    <class 'str'>
  • 字典的序列化
res = json.dumps({'name':'Andy', 'age':10})
print(res)  # {"name": "Andy", "age": 10}  <class 'str'>
  • set不能序列化
res = json.dumps(set('abc'))
print(res)  # TypeError: Object of type set is not JSON serializable

hashlib模块

  • hashlib模块-学习:
  • 封装一些用来加密的一些类:
  • md5()----不可逆—王小云测算可逆
  • 注意:加密的目的:用于判断和验证,而并非解密,
  • 特点:
  • 1.把一个大的数据,切分成不同快,分别对不同的快进行加密,再汇总的结果,和直接对整体数据加密的结果是一样的
  • 2.单向加密,不可逆,
  • 3.原始数据的一点小的变化,将导致结果的非常大的差异,'雪崩’效应
'''md5加密算法:
    给一个数据加密的三大步骤:
        1.获取一个加密对象(md5......)
        2.使用update方法进行加密,加密方法可以调用多次
        3.通常通过hexdigest获取加密结果,或digest()方法获取字节串
'''
# 1.获取一个加密对象
m = hashlib.md5()

# 2.使用加密对象的update,进行加密
m.update(b'abc')  # 字节类型的参数     b''里面不能加中文
m.update('abc中文'.encode('utf-8'))

# 3.(1)通过hexdigest获取加密的结果
res = m.hexdigest()
print(res)  # 1af98e0571f7a24468a85f91b908d335   ---字符串类型   ---16进制(四个二进制位)
# 3.(2)通过digest()方法加密结果获取字节串
res = m.digest()
print(res)  # b'\x1a\xf9\x8e\x05q\xf7\xa2Dh\xa8_\x91\xb9\x08\xd35'
  • 给一个数据加密
  • 验证:用另一个数据加密的结果第一次加密的结果进行对比
  • 如果加密结果一样,说明原文相同,如果不相同,说明原文不同
  • 不同加密算法,加密结果的长度不同
s = hashlib.sha224()
s.update('abc'.encode('utf-8'))
print(s.hexdigest())  # 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7

print(len(hashlib.md5().hexdigest()))  # 32个十六进制位
print(len(hashlib.sha256().hexdigest()))  # 64个十六进制位
  • 创建加密对象时,可以指定参数,成为salt 通过对原始口令加一个复杂字符串来实现,俗称“加盐
m = hashlib.md5(b'abc')
print(m.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72
#
m = hashlib.md5()
m.update('abc'.encode('utf-8'))
print(m.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72

m = hashlib.md5(b'abc')
m.update('ccc'.encode('utf-8'))
print(m.hexdigest())  # bd1e6dd82ca1e4a0408d653407d13c85
  • 把一个大的数据,切分成不同快,分别对不同的快进行加密,再汇总的结果,和直接对整体数据加密的结果是一样的
m = hashlib.md5()
m.update('abc'.encode('utf-8'))
m.update('def'.encode('utf-8'))
print(m.hexdigest())  # e80b5017098950fc58aad83c8c14978e

m = hashlib.md5()
m.update('abcdef'.encode('utf-8'))
print(m.hexdigest())  # e80b5017098950fc58aad83c8c14978e
  • 注册登录程序
  • 用户选择
def get_md5(username, passwd):
    # 获取加密对象
    m = hashlib.md5()
    # 使用加密对象的update,进行加密
    m.update(username.encode('utf-8'))
    m.update(passwd.encode('utf-8'))
    return m.hexdigest()

def register(username, passwd):
    # 获取返回值
    res = get_md5(username, passwd)
    # 写入文件  利用a模式操作文件,那么它会在文件的最后面追加内容
    with open('login', 'a') as f:
        f.write(res)
        f.write('\n')
def login(username, passwd):
    # 获取当前登录信息的加密结果
    res = get_md5(username, passwd)
    # 读文件,进行对比
    with open('login', 'r') as f:
        for line in f:
            if res == line.strip():
                return True
        else:
            return False
while True:
    op = int(input("1.注册 2. 登录 3.退出"))
    if op == 1:
        username = input("输入用户名:")
        passwd = input("输入密码:")
        register(username, passwd)

    elif op ==2:
        username = input("输入用户名:")
        passwd = input("输入密码:")
        res = login(username, passwd)
        if res:
            print('登录成功')
        else:
            print('登录失败')
    elif op == 3:
        break