锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

第六周知识总结

时间:2022-09-20 17:00:00 连接器q18j4a

文章目录

  • 星期一
    • 购物车系统
      • 项目功能
  • 星期二
    • 正则法则
      • 正则表达式
      • 正则表达式字符组
      • 正则表达式的特殊符号
      • 正则表达式的量词
    • 贪婪匹配与非贪婪匹配
    • 取消转义
    • 正则表达式实战
  • 星期三
    • re模块
    • 网络爬虫简介
    • 第三方模块
    • openpyxl模块
    • openpyxl实操
  • 星期四
    • openpyxl模块读数据
    • random随机数模块
    • hashlib加密模块
    • subprocess远程命令模块
    • logging日志模块
  • 星期五
    • 项目开发流程
    • 三层架构

星期一

购物车系统

项目功能

  • 1.用户注册

    思路

    首先获取注册用户名和密码,然后设置字典,然后存储在文件中,或设置一些默认值;然后拼接路径,如果没有文件路径,w模式自动创建文件,然后写入字典;我们也可以加密密码

  • 2.用户登录

    思路

    首先获取您的登录信息,然后根据用户名打开相应的文件。如果文件不存在,则输出用户不存在;然后打开文件,提取文件中的登录信息,然后根据判断结果进行判断,输出不同的结果。密码也应加密;我们还需要在整体情况下添加一个字典,将用户名放入其中,并写一个装饰来判断用户是否登录。如果已经登录,可以使用其他功能,否则不能使用。

  • 3.加购物车

    思路

    先向用户展示您的商品信息,然后获取用户的购买信息,这里我们可以提前设置一个空的购物车字典,注意这个字典应该放在循环的外面;然后加入你买的东西,最后当你不想买的时候,写入用户文件。还要注意购买过程中个数的添加和计算。

  • 4.结算购物车

    思路

    首先获取登录用户的文件路径,然后获取文件中的信息,获取用户的购买信息,然后计算一系列购买金额,然后获得文件中的余额,然后相互减少;你也可以判断余额和购物车商品的总价格,然后根据不同的结果输出不同的结果。然后将余额信息重新写入文件中,然后,如果购买成功,直接清空购物车。

    注意

    1.如果前期不熟练,不要使用软件开发目录规范 (先写功能 写完再慢慢拆分)
    2.可以先构建项目的整体框架 不要编写核心逻辑 (空函数)

星期二

正则法则

正则表达式

  • 简介

    正则法则不属于任何编程语言 是一个独立的学科 主要用于数据的搜索和筛选 
  • 前戏

    验证手机号码

    纯代码实现

     # 1.获取用户输入的手机号码         phone_num = input(请输入您的手机号码>>>:').strip()         # 2.判断用户输入的手机号码是否为纯数字         if phone_num.isdigit():             # 3.判断总长度是否为11位             if len(phone_num) == 11:                 # 4.判断是否从普通电话号码开始。 13 15 17 18 19                 if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(                     '17') or phone_num.startswith('18') or phone_num.startswith('19'):                     print(手机号合法)                     print(int(phone_num))                 else:                     print('手机号开头不对')
                else:
                    print('手机号必须是11位')
            else:
                print('手机号必须是纯数字')
    

    正则实现

    	  import re
            phone_num = input('把你的手机号告诉我>>>:').strip()
            if re.match('^[13|15|17|18|19][0-9]{9}',phone_num):
                print(phone_num)
            else:
                print('输入不合法')
    

    总结

    正则表达式本质上就是使用一些符号的组合产生一些特殊的含义
    然后去字符串中筛选出符合条件的数据

正则表达式之字符组

正则表达式线上测试网址:http://tool.chinaz.com/regex/

字符串在没有量词的情况下,一次只会针对一个数据值

范围 含义
[0-9] 匹配0到9之间的任意一个数字(包括0和9)
[A-Z] 匹配A到Z之间的任意一个字母(包括A和Z)
[a-z] 匹配A到Z之间的任意一个字母(包括a和z)
[0-9a-zA-Z] 数字、小写字母、大写字母都可以

在中括号内编写的多个数据值彼此都是或的关系

正则表达式之特殊符号

特殊符号在没有量词修饰的情况时一个符号一次只会针对一个数据值

  • 匹配单个字符
符号 功能
. 匹配除了换行符以外的任意字符
\w 匹配字母或者数字或者下划线
\W 匹配非字母或者数字或者下划线
\d 只会匹配数字
\D 匹配非数字的字符
\s 匹配空白,即空格
\S 匹配非空白
  • 特殊符号
符号 功能
^ 匹配字符串的开头
$ 匹配字符串的末尾
() 给正则表达式分组,但是不影响正则的正常匹配
[] 匹配字符组内的字符
[^] 匹配除了字符组中的字符以外的字符

正则表达式之量词

符号 功能
* 重复零次或者多次(默认情况下就是尽可能的多取)
+ 重复一次或者多次(默认情况下就是尽可能的多取)
? 重复零次或者一次(默认情况下就是尽可能的少取)
{n} 重复n
{n,} 重复n次或者更多次
{n,m} 重复n次到m次(默认情况下为m次)

贪婪匹配与非贪婪匹配

Python⾥数量词默认是贪婪的,总是尝试匹配尽可能多的字符;⾮贪婪则相反,总是尝试匹配尽可能少的字符。

待匹配的文本:
正则表达式:<.*>  # 贪婪匹配
上述正则匹配出来的内容是:
正则表达式:<.*?>  # 非贪婪匹配
上述正则匹配出来的内容是:

所有的量词默认都是贪婪匹配 但是如果在量词的后面紧跟一个问号
那么就会变成非贪婪匹配
小技巧:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用.或 者.?
并且结束的标志有上述符号左右两边添加的表达式决定

取消转义

  • 问题引入

    正则表达式里使用的”\”作为转义字符,这就可能造成反斜杠困扰。

  • 处理方法

    假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,Python中字符串前⾯加上 r 表示原⽣字符串。

正则表达式实战

编写校验用户手机号的正则
	0?(13|14|15|17|18|19)[0-9]{9}
编写校验用户身份证的正则
	\d{17}[\d|x]|\d{15}
编写校验用户邮箱的正则
	\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
编写校验用户qq号的正则
	[1-9]([0-9]{5,11})

这些常用的肯定是已经有人已经写过了的,这个时候我们可以通过百度查询

星期三

re模块

  • 引言

    1.在python中如果想使用正则表达式re模块是选择之一

    2.在python中无法直接使用正则 需要借助于模块(1.内置的re模块, 2.第三方模块)

    3.有一些模块内置函数在调用时需要连续编写正则表达式,这样的话就可以提前写好后续需要经常使用的正则
    变量名=re.compile(正则表达式)
    re.函数名(变量名,待匹配文本)

  • 常见的四种函数方法

函数名 功能
findall 通过正则表达式筛选出文本中所有符合条件的数据
search 通过正则表达式匹配到一个符合要求的结果就会结束
match 通过正则表达式从开头开始匹配,如果头部不符合就结束,如果符合的话也就会返回一个
compile 能够提前准备好正则, 之后可以反复使用,减少代码冗余

re.search

1.re.search 扫描整个字符串并返回第一个成功的匹配,如果没有匹配,就返回一个 None。
2.re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达 式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配

re.match

1.匹配到数据的话,可以使⽤group⽅法来提取数据。以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
2.group()用来提出分组截获的字符串,()用来分组,group() 同group(0)就是匹配正则表达式整体结果,group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。没有匹配成功的,re.search()返回None。

  • re模块补充说明

分组

import re

res = re.findall('abc','abcabcabcabc')
print(res)  # ['abc', 'abc', 'abc', 'abc']
res = re.findall('a(b)c','abcabcabcabc')
print(res)  # ['b', 'b', 'b', 'b']
res = re.findall('a(?:b)c', 'abcabcabcabc')
print(res)  # ['abc', 'abc', 'abc', 'abc']

findall也能够取消分组优先展示

别名(?P<>)

import re

res = re.search('a(?Pb)(?Pc)','abcabcabcabc')
print(res.group())  # abc
print(res.group(1))  # a
print(res.group('id'))  # b
print(res.group('name'))  # c

网络爬虫简介

思考

1.什么是互联网?

将全世界的计算机连接到一起组成的网络

2.互联网发明的目的是什么?

将接入互联网的计算机上面的数据彼此共享

3.上网的本质是什么?

基于互联网访问别人计算机上面的资源(有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器)

4.网络爬虫的本质

模拟计算机浏览器朝目标网址发送请求回去数据并筛选
只要是浏览器可以访问到的数据网络爬虫理论上都可以

5.获取红牛分公司的数据

http://www.redbull.com.cn/about/branch

第三方模块

1.第三方模块必须先下载才可以导入使用
2.python下载第三方模块需要借助于pip工具
3.下载命令:pip3.8 install 模块名

我们在下载模块的时候会遇到很多的问题

1.下载速度很慢
pip工具默认是从国外的仓库地址下载模块,速度很慢
这个时候我们就可以切换下载地址

2.下载报错

1.pip工具版本过低, 直接拷贝提示信息里面的更新命令即可

python38 -m pip install --upgrade pip

2.网络波动 关键字是Read timed out

只需要重新下载几次即可 或者切换一个网络稳定一点的

3.有些模块在下载使用之前需要提前配置指定的环境

结合具体情况 百度搜索

3.模块也有版本
pip3.8 install 模块名==版本号

eg: pip3.8 install django==1.11.11

openpyxl模块

  • 作用

    主要用于操作excel表格 也是pandas底层操作表格的模块
    
  • 了解

    在python中能够操作excel表格的模块有很多
    openpyxl属于近几年比较流行的模块
    openpyxl针对03版本之前的excel文件兼容性不好
    xlwt、xlrd也可以操作excel表格
    兼容所有版本的excel文件 但是使用方式没有openpyxl简单

  • excel版本问题

    03版本之前 excel文件的后缀名 .xls
    03版本之后 excel文件的后缀名 .xlsx
    如果是苹果电脑excel文件的后缀 .csv

  • 下载模块

pip3.8 install openpyxl

在这里插入图片描述

openpyxl实操

1.创建excel文件
	 from openpyxl import Workbook  # 导入模块

    wb = Workbook()  # 创建excel文件

    wb1 = wb.create_sheet('成绩表')
    wb2 = wb.create_sheet('财务表')
    wb3 = wb.create_sheet('校花表', 0)

    wb1.title = '舔狗表'  # 支持二次修改
    wb1.sheet_properties.tabColor = "1072BA"  # 修改工作簿颜色

    wb.save(r'111.xlsx')  # 保存文件
    
2.写入数据
	# 第一种写入方式
    wb1['A1'] = '叙利亚悍匪'
    wb1['D2'] = '慢男'
    # 第二种写入方式
    wb1.cell(row=3, column=2, value='老六慢走')
    # 第三种写入方式(批量写入)
    wb1.append(['username','password','age','gender','hobby'])
    wb1.append(['jason1',123,18,'male','read'])
    wb1.append(['jason2',123,18,'male','read'])
    wb1.append(['jason3',123,18,'male','read'])
    wb1.append(['jason4',123,18,'male','read'])
    wb1.append(['jason4',123,18,'male',None])
    wb1.append([None,123,18,'male',''])


    wb1['F11'] = '=sum(B5:B10)'

星期四

openpyxl模块读数据

模块

from openpyxl import load_workbook

读取方法

from openpyxl import load_workbook

wb = load_workbook(r'111.xlsx', data_only=True)

wb1 = wb['舔狗表']
print(wb1.max_row)  # 读出行数 10
print(wb1.max_column)  # 读出列数 5
print(wb1['A1'].value)  # 读出位置对应的值
print(wb1.cell(row=2, column=2).value)  # 根据坐标找值,没有则返回None

利用循环全部取值(可根据行或者列取值)

eg:

for j in wb1.rows:
    print([i.value for i in j])  # 列表生成式,没有数据值的用None表示

''' ['叙利亚悍匪', None, None, None, None] [None, None, None, '慢男', None] [None, '老六慢走', None, None, None] ['username', 'password', 'age', 'gender', 'hobby'] ['jason1', 123, 18, 'male', 'read'] ['jason2', 123, 18, 'male', 'read'] ['jason3', 123, 18, 'male', 'read'] ['jason4', 123, 18, 'male', 'read'] ['jason4', 123, 18, 'male', None] [None, 123, 18, 'male', None] '''

openpyxl不擅长读数据, 所以有一些模块优化了读取的方式
eg:pandas模块

eg:

import pandas
d = { 
        
    '公司名称': ['老男孩', '老女孩', '老伙计', '老北鼻'],
    '公司地址': ['上海', '深圳', '杭州', '东京'],
    '公司电话': [120, 130, 129, 996],
}
df = pandas.DataFrame(d)
df.to_excel(r'222.xlsx')

封装了openpyxl的pandas模块操作excel表格的方式

random随机数模块

简介

代码中经常有一些生成随机数的需求。特意整理了一下python中random模块的一些相关用法。

基本用法

随机验证码

import random  # 导入模块

sum = ''  # 初始为空字符串
for i in range(5):  # 五位随机数
    random_number = str(random.randint(0, 9))  # 随机产生0~9的一个数字
    random_update = chr(random.randint(65, 90))  # 随机产生一个大写字母
    random_lower = chr(random.randint(97, 122))  # 随机产生一个小写字母
    res = random.choice([random_number, random_update, random_lower])  # 在这三种符号中随机产生一个

    sum = res + sum  # 以字符串的形式拼接

print(sum)  # tW529

hashlib加密模块

  • 简介

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。什么是摘要算法呢?摘要算法又称哈希算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串。

  • 思考

1.什么是加密?

将明文数据(看得懂)经过处理之后变成密文数据(看不懂)的过程

2.为什么要加密?

不想让敏感的数据轻易的泄露

3.如何判断当前数据值是否已经加密

一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
  • 常见的加密算法

    md5 sha系列 hmac base64
    
  • 代码实参

    import hashlib
    
    md5 = hashlib.md5()  # 选择md5加密算法作为数据的加密策略
    md5.update(b'lzq')  # 往里面添加明文数据 数据必须是bytes类型
    res = md5.hexdigest()  # 获取加密之后的结果
    print(res)  # e7323ffbdae2c49b1b52583b87b635ea
    

注意

1.不同的算法 使用方法是相同的

密文的长度越长 内部对应的算法越复杂
但是

1.时间消耗越长
2.占用空间更大

2.通常情况下使用md5算法 就可以足够了
3.加密之后的结果一般情况下不能反解密
4.只要明文数据是一样的那么采用相同的算法得出的密文肯定一样

往里面添加明文数据时,数据必须是bytes类型

  • 使用场景

    1.密码的密文存储
    2.校验文件内容是否一致

  • 加盐处理

    import hashlib
    
    password = input('password>>>:').strip()
    md5 = hashlib.md5()
    md5.update('公司设置的盐(干扰项)'.encode('utf8'))  # 加盐处理
    md5.update(password.encode('utf8'))  # # 真正的内容
    res = md5.hexdigest()
    print(res)  # 我们可以发现这样输出的结果和上面正常输出的结果就不一样了
    # password>>>:lzq
    #4030375117c2a6d8f16cb4a43636c314
    
  • 动态加盐

    import hashlib
    
    def get_md5(data):  # 函数传参的形式
    	md = hashlib.md5()
    	md.update('加盐'.encode('utf-8'))
    	md.update(data.encode('utf-8'))
    	return md.hexdigest()
    
    
    password = input('password>>>:')
    res = get_md5(password)
    print(res)
    

subprocess远程命令模块

  • 功能简介

    该模块可以实现远程操作其他计算机的功能,动态获取命令执行并返回结果

  • 内置方法

    主要使用subprocess.Popen()

  • 举例说明

    模拟计算机cmd命令窗口
    eg:

    import subprocess
    
    cmd = input('请输入您的指令>>>:').strip()
    sub = subprocess.Popen(cmd,
                           shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE
                           )  
    # stdout执行命令之后正确的返回结果
    print(sub.stdout.read().decode('gbk'))
    # stderr执行命令报错之后的返回结果
    print(sub.stderr.read().decode('gbk'))
    

logging日志模块

  • 思考

1.什么是日志?

操作记录

2.为什么要使用日志?

为了记录事物发生的事实
  • 日志的五大等级
标识 解释
DEBUG 调试过程中使用DEBUG等级,如算法中每个循环的中间状态
INFO 处理请求或者状态变化等日常事务
WARNING 发生很重要的事件,但是并不是错误时,如用户登录密码错误
ERROR 发生错误时,如IO操作失败或者连接问题
CRITICAL 特别糟糕的事情,如内存耗尽、磁盘空间为空,一般很少使用
  • 详情请看:日志使用模块

(简单日志) 使用流程:8步

1.logger对象:负责产生日志。logger.getLogger()方法填写日志的名字
2.filter对象:过滤日志(了解)
3.handler对象:控制日志输出的位置(存放到文件/终端)可以有多个
4.formmater对象:规定日志内容的格式。
5.给logger对象绑定handler对象:addHandler()
6.给handler绑定输出格式(formmate).setFmatter()方式
7.设置日志等级.setLevel()
8.写日志.debug()

  • 封装成函数的应用

    def get_logger(msg):
        # 记录日志
        logging.config.dictConfig(settings.LOGGING_DIC)  # 自动加载字典中的配置
        logger1 = logging.getLogger(msg)
        # logger1.debug(f'{username}注册成功') # 这里让用户自己写更好
        return logger1
    

星期五

项目开发流程

1.需求分析

明确项目的主体功能(到底要写什么东西 实现什么功能)

问产品经理 问客户

参与人员

产品经理 开发经理 架构师

技术人员主要职责

引导客户提出一些比较合理 比较容易实现的需求

2.架构设计

明确项目的核心技术点

项目使用的编程语言
项目使用的框架
项目使用的数据库

参与人员

架构师

3.分组开发

明确每个组每个人写哪些功能
参与人员

架构师 开发经理
普通的程序员

4.提交测试

自己测试、测试小姐姐测试
参与人员

普通的程序员
测试小姐姐

5.交付上线

参与人员

运维工程师
可以交给客户也可以帮客户维护(定期收钱)

大公司好
	大公司你相当于是一颗螺丝钉 干的活儿非常的明确 只干很小的一部分
	但是对自己的履历很有优势 将来跳槽方便
小公司好
	小公司你相当于是全能超人 什么事都自己干 短期内提示非常大
	但是会非常的类 一个人干好几个人的活儿

三层架构

三层架构

用户层

数据展示 数据获取
cmd窗口可以充当用户层
将来可以替换成浏览器或者app

核心逻辑层

业务逻辑
某个py文件充当逻辑层
将来可以替换成软件开发目录规范或者现成的框架

数据层

数据的增删改查
json文件充当数据库
将来可以替换成数据库程序

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章