第六周学习笔记总结
今日内容概要
- 购物车程序
- 正则表达式
- re模块
- openpyxl模块
- 第三方模块下载
- random随机数模块
- hashlib加密模块
- subprocess模块
- logging日志模块
今日内容详细
购物车程序
-
购物车功能基础框架搭建
1.空函数 2.功能字典 3.循环
-
购物车功能之注册
1.动态创建db文件夹 2.获取用户数据 3.拼接存储用户数据的文件路径 4.判断文件路径是否存在 5.如果存在则表示用户名已注册 6.如果不存在构建用户字典(诸多键值对) 7.json序列化到文件中
-
购物车功能之登录
1.获取用户数据 2.拼接存储用户数据的文件路径 3.判断文件路径是否存在 4.如果存在则获取文件中用户的真实数据 5.根据真实数据与用户输入的数据比对 6.使用全局大字典记录用户的登录状态(用户名) 7.如果不存在则提示错误信息
-
购物车功能之校验用户身份
1.装饰器模板 2.根据全局大字典是否存储了用户名判断是否可执行被装饰函数
-
购物车功能之添加购物车
1.校验用户身份(装饰器自动完成) 2.循环打印商品数据(枚举) 3.获取用户输入的商品编号 4.针对编号做一些比较小的完善处理(纯数字 范围) 5.根据编号获取对应的商品数据 6.获取用户购买的数量 7.创建一个临时购物车字典存储用户想要购买的商品 8.获取用户真实数据中的购物车 9.判断购物车中是否已经含有商品数据 10.如果有则采用自增的方式 11.如果没有则采用新建键值对的方式 12.将用户数据重新序列化到文件中 """ 1.针对一些数据可以做注释 2.习惯使用打印操作 查看某些关键点 """
-
购物车功能之结算购物车
1.通过登录的用户名获取用户数据 2.获取购物车数据 3.计算购物车中商品的总价 4.判断总价是否小于用户账户余额 5.如果小于或等于则完成扣款并清空购物车 最后重新写入 6.如果大于则提示用户余额不够 并保持购物车数据不变
正则表达式
正则表达式线上测试网址: http://tool.chinaz.com/regex/
官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的
一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字
符串”用来表达对字符串的一种过滤逻辑。
主要用于数据的查找与筛选
- 正则表达式之特殊符号
符号 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\W | 匹配非字母或数字或下划线 |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
a|b | 匹配字符a或字符b |
() | 给正则表达式分组,不影响正则表达式的匹配 |
[] | 匹配字符组中的字符 |
[^] | 匹配除了字符组中字符的所有字符 |
\s | 匹配任意的的空白符 |
\n | 匹配换行符 |
\t | 匹配制表符 |
\b | 匹配一个单词的结尾 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
- 正则表达式之量词
量词 | 用法说明 |
---|---|
* | 重复零次或更多次(默认就是尽可能多) |
+ | 重复一次或更多次(默认就是尽可能多) |
? | 重复零次或一次(默认就是一次) |
重复n次 | |
重复n次或更多次 | |
重复n到m次 |
re模块
方法 | 作用 |
---|---|
findall | 通过正则表达式筛选出文本中所有符合条件的数据 |
finditer | 与findall作用一致,只不过结果会被处理成迭代器对象,用于节省内存 |
search | 通过正则表达式匹配到一个符合条件的内容就结束 |
match | 通过正则表达式从头开始匹配,如果开头就不符合,后面就不走了 |
compile | 能够提前准备好正则,之后可以反复使用减少代码冗余 |
下面了解即可 | |
fullmatch | 要求目标文本要完全匹配规则,否则返回None |
sub | 将与规则匹配的字符串替换为其他文本 |
split | 从与规则匹配的字符串进行切割,返回切割后字符串组成的列表 |
groups | 用于查看指定分组匹配到的内容 |
openpyxl模块
1.打开文件
创建
from openpyxl import Workbook
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
打开已有
from openpyxl import load_workbook
wb2 = load_workbook('文件名称.xlsx')
2.存储数据
方式一:数据可以直接分配到单元格中(可以输入公式)
ws['A1'] = 42
方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
方式三:Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
3.创建工作表
方式一:插入到最后(default)
ws1 = wb.create_sheet("Mysheet")
方式二:插入到最开始的位置
ws2 = wb.create_sheet("Mysheet", 0)
4.修改工作表的名称
ws.title = '舔狗表' # 支持二次修改
5.查看表名
显示所有表名
print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
遍历所有表
for sheet in wb:
print(sheet.title)
6.写入数据
方法一
c = ws['A4']
方法二:row 行;column 列
d = ws.cell(row=4, column=2, value=10)
方法三:只要访问就创建
for i in range(1,101):
for j in range(1,101):
ws.cell(row=i, column=j)
方法四:批量写入
ws.append(['username','password','age','gender','hobby'])
ws.append(['jason1',123,18,'male','read'])
ws.append(['jason2',123,18,'male','read'])
ws.append(['jason3',123,18,'male','read'])
ws.append(['jason4',123,18,'male','read'])
ws.append(['jason4',123,18,'male',None])
ws.append([None,123,18,'male',''])
7.保存数据
wb.save('文件名称.xlsx')
8.其他
计算B5到B10之间的和写在F11的位置
ws['F11'] = '=sum(B5:B10)'
改变 sheet 标签按钮颜色
ws.sheet_properties.tabColor = "1072BA"
获取最大行,最大列
print(sheet.max_row)
print(sheet.max_column)
删除工作表
方式一
wb.remove(sheet)
方式二
del wb[sheet]
# openpyxl读写数据使用的模块不一样
from openpyxl import Workbook, load_workbook
wb = load_workbook(r'111.xlsx',data_only=True) # 读取名为111.xlsx的文件
print(wb.sheetnames) # 查看excel文件中所有的工作簿名称
wb1 = wb['红浪漫消费记录'] # 获取表红浪漫消费记录
print(wb1.max_row) # 表的最大行数
print(wb1.max_column) # 表的最大列数
# 方式一:
print(wb1['A1'].value) # 位于A1位置的数据
# 方式二:
print(wb1.cell(row=2, column=2).value) # 位于第二行第二列位置的数据
# 循环获取每一行的数据
for i in wb1.rows:
print([j.value for j in i]) # ['username', 'gender', 'age']
# 循环获取每一列的数据
for j in wb1.columns:
print([i.value for i in j]) # ['username', 'jason', 'kevin', 'tony', None]
第三方模块下载
1.第三方模块必须先下载才可以导入使用
2.python下载第三方模块需要借助于pip工具
3.下载命令
pip3.8 install 模块名
random随机数模块
方法 | 作用 |
---|---|
random | 返回0到1之间随机的小数 |
randint(a,b) | 用于声场一个指定范围内的整数。其中,参数a是下限,b是上限,生成的随机数n:a<=n<=b |
choice(seq) | 从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError |
sample(seq,k) | 从指定序列中随机获取K长度的片段。不会修改原有的序列 |
shuffle(x) | 将序列 x 随机打乱位置 |
hashlib加密模块
- 常见加密算法
md5 sha系列 hmac base64
import hashlib
md5 = hashlib.md5() # 选择md5加密算法作为数据的加密策略
md5.update(b'123') # 往里面添加明文数据 数据必须是bytes类型
res = md5.hexdigest() # 获取加密之后的结果
print(res) # 202cb962ac59075b964b07152d234b70
subprocess模块
模拟计算机cmd命令窗口
import subprocess
cmd = input('请输入您的指令>>>:').strip()
sub = subprocess.Popen(cmd, # 在终端运行的命令
shell=True, # 新开一个终端
stdout=subprocess.PIPE, # 执行完命令, 将正确输出放到一个管道里
stderr=subprocess.PIPE # 将错误输出放到一个管道里
)
# stdout执行命令之后正确的返回结果
print(sub.stdout.read().decode('gbk')) # 拿到的是 bytes 格式的字符,在windows需要使用gbk编码,linux和mac上是"utf-8"
# stderr执行命令报错之后的返回结果
print(sub.stderr.read().decode('gbk')) # 拿到的是 bytes 格式的字符,在windows需要使用gbk编码,linux和mac上是"utf-8"
logging日志模块
- 日志等级
日志等级 | 用处 | 数字记录 |
---|---|---|
debug等级 | 可以帮助我们在平时的开发过程中,帮助我们查看一些输出的信息是否正确,它可以替代我们平时使用的 print() 函数 | 10 |
info等级 | 它代表了一般的消息类信息,只是为了记录一些程序的行为,比如程序执行到了某个位置,进行一些简单的记录 | 20 |
warning等级 | 该等级是一种警告,一般来说程序不会出错,但是可能存在一定的潜在风险(默认从warning级别开始记录日志) | 30 |
error等级 | 一般对应业务中出现了重大问题。比如异常或者业务逻辑不应该执行到某种情况,我们都可以通过error来进行记录 | 40 |
critical等级 | 比 error 更严重的级别,不过一般来说 error 级别已经很严重了, 所以 critical 很少使用 | 50 |
- 日志模块组成部分
组成部分 | 名称 |
---|---|
日志的产生(准备原材料) | logger对象 |
日志的过滤(剔除不良品) | filter对象(可以忽略) |
日志的产出(成品) | handler对象 |
日志的格式(包装) | format对象 |
- 日志配置字典
import logging
import logging.config
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 自定义文件路径
logfile_path = 'a3.log'
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger('购物车记录')
logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了