一条混迹职场底层多年的咸鱼,一直躺平从未奋发。承蒙她的不弃,与她相知相恋并走进婚姻。为了家庭有更好的生活,咸鱼也是时候努力一把了。
然而人在职场没有一技之长,努力很难得到回报。Python是一种相对容易获得的技能,可作为职场辅助技能。
虽然不知道高龄转行技术路线这条路会通往何方,但是努力了总有那么些许机会
这篇文章将记录咸鱼学习Python的每一天日常,以此作为学习的监督和记录
5-20
第五周 python文件操作
2-1 序列化
# coding:utf-8
"""
info = [1, 'str', [1, 2, 3], (4, 5, 6), {'name': '小慕'}, True, False, None]
a, b, c, d = {1, 2, 3}, fun, Test(), Test
f = [a, b, c, d]
1、 将info内的元素序列化后反序列化,观察序列化前后的 数据变化 和 数据类型变化(分别用json和pickle 2种模块)
2、 try: f内的元素序列化,观察 except: 输出的内容(分别用json和pickle 2种模块)
3、注:json是通用模块,pickle是python专有模块
"""
import json
import pickle
def fun():
pass
class Test(object):
pass
info = [1, 'str', [1, 2, 3], (4, 5, 6), {'name': '小慕'}, True, False, None]
a, b, c, d = {1, 2, 3}, fun, Test(), Test
f = [a, b, c, d]
for _ in info:
dump = json.dumps(_)
# 元组类型是python的特有类型,json.dumps()元组会先转换成列表再序列化。
# True False None 在其他语言中更多地表示为 true false null。 json.dumps()后会序列化为 true false null
# json.dumps()只能序列化ascii字符,数据中含有 中文及特殊符号等不在ascii字符范围的数据 时,
# 先将不在ascii字符范围的数据 用encode("unicode_escape") 转义成 unicode_escape编码的bytes类型
# 再将数据序列化成str
print(f'{_}\t\t{type(_)}\t\t{dump}\t\t{type(dump)}')
load = json.loads(dump) # json.dumps()把元组转换成列表再序列化成str,json.loads()只能反序列化成列表
# json.loads()先把str数据转换成对应的数据,再将 unicode_escape编码的bytes类型数据 转义成 不在ascii字符范围的数据
print(f'{dump}\t\t{type(dump)}\t\t{load}\t\t{type(load)}')
for _ in info:
dump = pickle.dumps(_)
# pickle.dumps() 把数据从当前数据类型转换成bytes 除元组外其余跟json.dumps()一致
# pickle.dumps() 可以将元组序列化为bytes
print(f'{_}\t\t{type(_)}\t\t{dump}\t\t{type(dump)}')
load = pickle.loads(dump)
# pickle.loads() 把数据从bytes转换成当前编码格式 除元组外其余跟json.loads()一致
# pickle.loads() 可以将bytes格式的元组 反序列化为当前编码格式的元组
print(f'{dump}\t\t{type(dump)}\t\t{load}\t\t{type(load)}')
for _ in f:
try:
json.dumps(_)
# 集合是中间数据类型,不能dumps()。函数,实例化类,未实例化类 等非数据对象不能jumps。同理json里也没有这些对象类型
except Exception as e:
print(e)
for _ in f:
try:
pickle.dumps(_)
except Exception as e:
print(e)
2-2yaml的用法
# coding:utf-8
"""
yaml文件介绍:
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件、数据交换等场景。它与JSON类似,但有一些不同之处:
YAML以缩进表示层次结构,更加直观易懂。
YAML支持注释,可以通过#符号来添加注释。
YAML还支持引用和别名,可以方便地重复使用数据结构。
YAML语法比较简单,没有JSON那么严格。例如,一个列表可以没有冒号结尾,而一个字典必须有冒号结尾。
总之,YAML是一种方便、简洁、易读易写的格式,适用于各种数据交换场景。
muke.yaml文件内容及简单注释:
url:
https://www.imooc.com/ # yaml没有数据类型,读yaml文件时由python判断数据类型
types:
- 前沿 # 列表
- 前端
- 后端
- 移动端
- 云计算
- 运维
- ui
python:
web: django # 字典
spader: bs5
a: 1
b: 2
c: [a, b, c]
练习:
1、 抄写一遍muke.yaml
2、 导入了yaml模块,用于解析YAML格式的数据。
3、 定义了一个read函数,用于读取指定路径下的YAML文件并返回解析后的结果。
4、 在主程序入口中调用read函数读取'muke.yaml'文件,并打印出解析后的结果以及结果的数据类型。
5、 输出了yaml模块的相关属性和方法,包括Loader、FullLoader等。
"""
import yaml
def read(path):
with open(path, 'r', encoding='utf-8') as f:
return yaml.load(f.read(), Loader=yaml.FullLoader)
# 使用PyYAML库中的load函数从文件中加载YAML格式的数据。
# 具体来说,load函数的第一个参数是要读取的YAML格式数据,第二个参数是指定Loader类,用于将数据解析成Python对象。
# 在这里,我们使用了yaml.FullLoader这个Loader类,它会尝试从文件中加载所有必需的信息并将其转换为相应的Python对象。
if __name__ == '__main__':
result = read('muke.yaml')
print(result, type(result))
print(dir(yaml))
第五周 常用函数与高阶函数
1-1 加密模块hashlib的应用
# coding:utf-8
"""
简单的自定义token校验系统
1、 custom() 函数用于生成 token。该函数首先获取int(当前时间戳),然后将 base_sign 和时间戳拼接成一个字符串,
再使用 SHA1 算法对字符串进行哈希运算,最后将哈希值转换为十六进制字符串作为 token。返回token, int(当前时间戳)
2、 b_service_check(token, timestamp) 函数用于校验 token 是否合法。
该函数接受两个参数:token 表示待校验的 token,timestamp 表示当前时间戳。该函数首先将 base_sign 和当前时间戳拼接成一个新的字符串,
再使用 SHA1 算法对新字符串进行哈希运算,得到一个新的哈希值 b_token。接着比较 token 和 b_token,如果它们相等则说明 token 合法,否则不合法。
3、 在主程序中,我们调用 custom() 函数生成一个 token 和对应的时间戳,然后等待一秒钟后调用 b_service_check() 函数校验该 token 是否合法。
如果 token 合法,则输出提示信息:'a合法,b服务可以进行帮助';否则输出另一个提示信息:'a不合法,b不可进行帮助'。
4、 b_service_check() 函数的timestamp参数分别用custom返回的int(时间戳)和int(当前时间戳),观察输出不同及原因
"""
base_sign = 'muke'
import hashlib
import time
def custom():
a_timestamp = int(time.time())
_token = '%s%s' % (base_sign, a_timestamp)
hashobj = hashlib.sha1(_token.encode('utf-8'))
# 将字符串根据’utf-8‘编码格式转换bytes类型数据再生成哈希对象
# 注意生成哈希对象的函数的参数都要求是bytes类型,要先转换再哈希
a_token = hashobj.hexdigest() # 将哈希对象转换成哈希编码。注:hexdigest()生成的是一串字符串
return a_token, a_timestamp
def b_service_check(token, timestamp):
_token = '%s%s' % (base_sign, timestamp)
b_token = hashlib.sha1(_token.encode('utf-8')).hexdigest()
if token == b_token:
return True
else:
return False
# ----------------
# 写成一行代码:
# def custom():
# timestamp = int(time.time())
# return hashlib.sha1(f'{base_sign}{timestamp}'.encode('utf-8')).hexdigest(), timestamp
#
#
# def b_service_check(token, timestamp):
# return True if hashlib.sha1(f'{base_sign}{timestamp}'.encode('utf-8')).hexdigest() == token else False
if __name__ == '__main__':
token, timestamp = custom() # 将base_sign用加密方法custom()生成token
time.sleep(1) #
print('a合法,b服务可以进行帮助' if b_service_check(token, timestamp) else 'a不合法,b不可进行帮助')
# b_service_check(token, timestamp):用b_service_check方法校验token是否合法
print('a合法,b服务可以进行帮助' if b_service_check(token, int(time.time())) else 'a不合法,b不可进行帮助')
1-2 加密模块base64的应用
# coding:utf-8
"""
该代码是一个Python3的加密解密程序,
使用base64进行编码和解码。
encode(data) 函数首先对输入数据进行检查,确保它是 bytes 类型或 str 类型。如果不是,则抛出 TypeError 异常:'data need bytes or str'
然后,将输入的字符串或字节流进行base64编码,并在输出结果中将字母'a'和'2'替换为'%'和'$'。
decode(data)函数首先检查输入数据是否为 bytes 类型,如果不是,则抛出 TypeError 异常。'data need bytes'
然后,将输入的base64编码结果进行逆向解码,并将字母'%'和'$'替换回原来的字母'a'和'2'。
在主程序中,首先调用encode函数对字符串"hello xiaomu"进行编码,得到编码结果"b'5oiR54vTmLfXnO/gCxAKcB"。
然后将编码结果转换成字节流,再调用decode函数对字节流进行解码,得到解码结果"hello xiaomu"。最后打印输出结果。
"""
import base64
def encode(data):
if isinstance(data, str):
data = data.encode('utf-8')
elif isinstance(data, bytes):
pass
else:
raise TypeError('type(data) need bytes or str')
return base64.encodebytes(data).decode('utf-8').replace('a', '%').replace('2', '$')
def decode(data):
if not isinstance(data, bytes):
raise TypeError('data need bytes')
return base64.decodebytes(
data.decode('utf-8').replace('%', 'a').replace('$', '2').encode('utf-8') # 先解码替换再重新编码
).decode('utf-8')
# return base64.decodebytes(
# data.replace('%'.encode('utf-8'), 'a'.encode('utf-8')).replace('$'.encode('utf-8'), '2'.encode('utf-8'))
# ).decode('utf-8') # 将bytes类型数据直接替换然后解码
if __name__ == '__main__':
a = 'hello xiaomu'
b = encode(a)
c = decode(b.encode('utf-8'))
print(a, c)
总结:
经过这段时间学习发现注释过多,花了太多精力在注释和表述上,导致实际学习的内容并不多。后续前面说明部分通过讯飞星火认知大模型和文心一言生成后修改。代码只注释新知识点,以期加快学习进度
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦