python第六周总结

186 阅读10分钟

这周主要围绕购物车和ATM和模块相关知识点进行学习

正则表达式

 不属于任何一门编程语言 是一个独立的学科 主要用于数据的查找与筛选
 正则表达式本质上就是使用一些符号的组合产生一些特殊的含义  然后去字符串中筛选出符合条件的数据
 需求:编写代码校验用户输入的手机号是否合法
     常见 13 15 17 18 19
 正则表达式
    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]匹配09之间的任意一个数字(包括09)  
        全称是:[0123456789]
[A-Z]匹配AZ之间的任意一个字母(包括A和Z)
        全称是:[ABCD...WXYZ]
[a-z]匹配AZ之间的任意一个字母(包括a和z)
        全称是:[abcd...wxyz]
在中括号内编写的多个数据值彼此都是或的关系
        [0-9a-zA-Z]
数字、小写字母、大写字母都可以

 正则表达式特殊符号
特殊符号在没有量词修饰的情况一个符号只会针对一个数据值
符号作用
.匹配除换行符以外的任意的字符
\w匹配字母或数字或下划线
\W匹配非字母或数字或下划线
\d匹配数字
匹配字符串的开头
$匹配字符串的结尾
ab
()给整则表达式分组 不影响正则表达式的匹配
[]匹配字符组中的字符
[^]匹配字符组中的所有字符
当^和$两者嘴和能够明确的限制想要查找的具体数据
管道符|在很多场景下的意思都是或
()用于后续的正则起别名  分组获取对应的数据

正则表达式量词

 在正则表达式中所有的量词默认都是贪婪匹配
 量词不能单独使用必须跟在表达式对的后面 并且只能影响紧挨着的左边哪一个
 
符号作用
*重复零次或跟多次(默认就是尽可能多)
+重复一次或更多次(默认就是尽可能多)
重复零次或一次(默认就是一次)
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
 贪婪匹配与非贪婪匹配
待匹配的文本:<script>alert(123)</script>
正则表达式:<.*>  # 贪婪匹配
上述正则匹配出来的内容是:<script>alert(123)</script>
正则表达式:<.*?>  # 非贪婪匹配
上述正则匹配出来的内容是:<script>      </script>
所有的量词默认都是贪婪匹配 但是如果在量词的后面紧跟一个问号
那么就会变成非贪婪匹配
小技巧:以后我们在使用贪婪匹配或者非贪婪匹配的时候一般都是用.*或者.*?
并且结束的标志有上述符号左右两边添加的表达式决定

 取消转义
正则表达式中取消斜杠与字母的特殊含义 就是在斜杠前面加斜杠
        \n	\n
        \\n	\n
在python中有更加简便的写法
        r'\n'
        r'\n'

re模块

import re
res = re.findall('a', 'jason oscar aaa')
print(res)  # ['a', 'a', 'a', 'a', 'a']  列表
findall通过正则表达式筛选出文本中所有符合条件的数据

res = re.finditer('a', 'jason oscar aaa')
print(res)  <callable_iterator object at 0x000002514D4F5C70>   
finditer与findall作用一致 只不过结果会被处理成迭代器对象 用于节省内存

res = re.search('a', 'jason oscar aaa')
print(res) <re.Match object; span=(1, 2), match='a'>
print(res.group())   a
search通过正则表达式匹配到一个符合条件的内容就结束

res = re.match('a', 'jason oscar aaa')
print(res)   None
match通过正则表达式从头开始匹配  如果头部已经不符合 那么后面不走了

obj = re.compile('a')
compile能够提前准备好正则 之后可以反复使用 减少代码冗余
print(re.findall(obj,'asjd21hj13123j'))
print(re.findall(obj,'fdh3jh45jhqjha'))
print(re.findall(obj,'asdasdadadasda'))

re补充

1.分组
res = re.findall('abc','abcabcabcabc')
print(res)  # ['abc', 'abc', 'abc', 'abc']
res = re.findall('a(b)c','abcabcabcabc')
findall针对分组的正则表达式匹配到的结果 优先展示

print(res)   ['b', 'b', 'b', 'b']
res = re.findall('a(?:b)c','abcabcabcabc')
findall也能够取消分组优先展示 (?:)
print(res)
res = re.search('a(b)c','abcabcabcabc')
print(res.group())   abc
print(res.group(0))   abc
print(res.group(1))   b
2.别名
res = re.search('a(?P<id>b)(?P<name>c)','abcabcabcabc')
print(res.group())
print(res.group(1))
print(res.group('id'))
print(res.group('name'))   

网络爬虫

1.什么是互联网:将全世界的计算机连接到一起组成的网络
2.互联网发明的目的是什么:将接入互联网的计算机上面的数据彼此共享
3.上网的本质是什么:基于互联网访问别人计算机上面的资源(有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器)
4.网络爬虫的本质:模拟计算机浏览器朝目标网址发送请求回去数据并筛选,只要是浏览器可以访问到的数据网络爬虫理论上都可以。

第三方模块下载

1.第三方模块必须先下载才可以导入使用
2.python下载第三方模块需要借助于pip工具
3.下载命令:pip3.8 install 模块名
1.下载速度很慢
        pip工具默认是从国外的仓库地址下载模块 速度很慢
        我们可以切换下载的地址(源地址)
                清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
                阿里云:http://mirrors.aliyun.com/pypi/simple/
                中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
                华中科技大学:http://pypi.hustunique.com/
                豆瓣源:http://pypi.douban.com/simple/
                腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
                华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
        pip3.8 install 模块名 -i 源地址
        pycharm提供第三方模块下载快捷方式
        也可以直接修改python解释器源文件(课下自行查阅)
2.下载报错
        1.pip工具版本过低 直接拷贝提示信息里面的更新命令即可
                python38 -m pip install --upgrade pip
        2.网络波动 关键字是Read timed out
                只需要重新下载几次即可 或者切换一个网络稳定一点的
        3.有些模块在下载使用之前需要提前配置指定的环境
                结合具体情况 百度搜索
3.模块也有版本:pip3.8 install 模块名==版本号
               pip3.8 install django==1.11.11
               
               

openpyxl模块

主要用于操作excel表格 也是pandas底层操作表格的模块
在python中能够操作excel表格的模块有很多
        openpyxl属于近几年比较流行的模块
        openpyxl针对03版本之前的excel文件兼容性不好
        xlwt、xlrd也可以操作excel表格
        兼容所有版本的excel文件 但是使用方式没有openpyxl简单
1.excel版本问题
        03版本之前 excel文件的后缀名 .xls
        03版本之后 excel文件的后缀名 .xlsx
        如果是苹果电脑excel文件的后缀 .csv
2.下载模块
        pip3.8 install 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 Workbook, load_workbook
wb = Workbook() 
wb1 = wb.create_sheet('洗浴中心', 0)
wb1 = wb.create_sheet('天上人间')
wb1 = wb.create_sheet('洗浴中心')
wb1.append(['username', 'gander', 'age'])
wb1.append(['jason', 'male''18']) 
wb1.append(['kevin', 'male', '19']) 
wb1.append(['jerry', 'male', '21'])
wb1.append(['tony', 'male', '20']) 
wb.save(r'111.xlsx')
wb = load_workbook(r'111.xlsx')
print(wb.sheetnames)# 查看excel文件中所有的工作簿名称
wb1=wb['洗浴中心'] 
print(wb1.max_row) 
print(wb1.max_column)
print(wb1['A1'].value) 
print(wb1.cell(row=2,column=2).value)
for j in wb1.columns:
print([i.value for i in j]) 
openpyxl 不擅长读数据 多以有一些模块优化了读取的方式
pandasmok 一层一层的优化

random随机数模块

import random 
print(random.random()) 返回的是0-1之间的随机的小数
print(random.randint(1, 6)) 返回16之间随机的整数
print(random.choice(['一等奖', '特等奖', '谢谢惠顾', '如花抱回家'])) 随机抽取一个
print(random.sample(['慢男', '快男', '猛男', '老六', '老七', '男男', '老八秘制小汉堡'], 3)) 随机抽取 自定义个数
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A', '大王', '小王'] random.shuffle(l1) print(l1) 就像扑克牌一样 随机打乱
搜狗python工程师笔试题 
code = '' 定义全局变量用于存储所有的验证码 
code = ''
import random 产生五位随机验证码(数字、小写字母、大写字母)
for i in range(5):  每次循环都应该产生 数字 小写字母 大写字母
random_int = str(random.randint(0, 9)) #随机产生一个数字 
random_lower = chr(random.randint(97, 122))  随机产生一个小写字 
random_upper = chr(random.randint(65, 90))  随机产生一个大写字母
从上面三个数据值中随机挑选一个作为验证码的一位数据 
temp = random.choice([random_int, random_lower, random_upper]) 
code += temp # 拼接字符串
print(code)

hashlib加密模块

1.什么是加密:将明文数据(看得懂)经过处理之后变成密文数据(看不懂)的过程
2.为什么要加密:不想让敏感的数据轻易的泄露
3.如何判断当前数据值是否已经加密:一般情况下如果是一串没有规则的数字字母符合的组合一般都是加密之后的结果
4.加密算法
就是对明文数据采用的加密策略
不同的加密算法复杂度不一样 得出的结果长短也不一样
通常情况下加密之后的结果越长 说明采用的加密算法越复杂
5.常见加密算法:md5 sha系列 hmac base64

补充

<1.加密之后的结果一般情况下不能反解
202cb962ac59075b964b07152d234b70 
所谓的反解密很多时候其实是偷换概念 
提前假设别人的密码是什么 
然后用各种算法算出对应的密文 
之后构造对应关系 然后比对密文 最终映射明文 
{'密文1':123,'密文2':321,...} 
<2.只要明文数据是一样的那么采用相同的算法得出的密文肯定一样
import hashlib
md5 = hashlib.md5() 
选择md5加密算法作为数据的加密策略 
md5.update(b'123') 往里面添加明文数据 数据必须是bytes类型
md5.update(b'hello') 往里面添加明文数据 数据必须是bytes类型 
md5.update(b'jason') 往里面添加明文数据 数据必须是bytes类型 
res = md5.hexdigest() print(res) 
31b9a81dc788368469ee4b78877eb1eb

<3.加盐处理(salt)
password = input('password>>>:').strip()
md5.update('公司设置的盐(干扰项)'.encode('utf8'))
md5.update(password.encode('utf8'))
res = md5.hexdigest() 
print(res)
78bf5bd131c520b54168206d75f9f9be
<4.动态加盐(salt) 
干扰项每次都不一样
每次获取当前时间 每个用户用户名截取一段 
<5.加密实际应用场景
1.用户密码加密:注册存储密文 登录也是比对密文 
2.文件安全性校验:正规的软件程序写完之后做一个内容的加密 
                网址提供软件文件记忆该文件内容对应的密文 
                用户下载完成后不直接运行 
                而是对下载的内容做加密
                然后比对两次密文是否一致 
                如果一致表示文件没有被改 
                不一致则表示改程序有可能被植入病毒 
3.大文件加密优化 :程序文件100G ,一般情况下读取100G内容然后全部加密 太慢,不对100G所有的内容加密 而是截取一部分加密 每隔500M读取30bytes

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'))
 stderr执行命令报错之后的返回结果
print(sub.stderr.read().decode('gbk'))

日志模块

1.什么是日志:日志就类似于是历史记录 
2.为什么要使用日志:为了记录事物发生的事实(史官)
3.如何使用日志
3.1.日志等级
import logging
logging.debug('debug等级')   10
logging.info('info等级')   20
logging.warning('warning等级')   默认从warning级别开始记录日志  30
logging.error('error等级')   40
logging.critical('critical等级')   50

日志模块组成部分

import logging
1.日志的产生(准备原材料)        logger对象
logger = logging.getLogger('购物车记录')
2.日志的过滤(剔除不良品)        filter对象>>>:可以忽略 不用使用
3.日志的产出(成品)             handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端
4.日志的格式(包装)             format对象
fm1 = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d',
)
5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
 7.设置日志等级
logger.setLevel(10)   debug
 8.记录日志
logger.debug('写了半天 好累啊 好热啊')
在以后需要写日志的时候不要按着上面的操作  gai'mo'kuai可以直接调用