一条混迹职场底层多年的咸鱼,一直躺平从未奋发。承蒙她的不弃,与她相知相恋并走进婚姻。为了家庭有更好的生活,咸鱼也是时候努力一把了。
然而人在职场没有一技之长,努力很难得到回报。Python是一种相对容易获得的技能,可作为职场辅助技能。
虽然不知道高龄转行技术路线这条路会通往何方,但是努力了总有那么些许机会
这篇文章将记录咸鱼学习Python的每一天日常,以此作为学习的监督和记录
# 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)
# 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))
# 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不可进行帮助')
# 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)
经过这段时间学习发现注释过多,花了太多精力在注释和表述上,导致实际学习的内容并不多。后续前面说明部分通过讯飞星火认知大模型和文心一言生成后修改。代码只注释新知识点,以期加快学习进度