为了账号安全,请及时绑定邮箱和手机立即绑定

520新的开始--python学习之路(慕课网python全能工程师)

标签:
Python

一条混迹职场底层多年的咸鱼,一直躺平从未奋发。承蒙她的不弃,与她相知相恋并走进婚姻。为了家庭有更好的生活,咸鱼也是时候努力一把了。
然而人在职场没有一技之长,努力很难得到回报。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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 2
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消