8/20
今日考题
1.名称空间与作用域
名称空间就是存放变量与值的绑定关系的地方
内置名称空间 全局名称空间 局部名称空间
作用域就是做在程序能起作用的领域
比如全局作用域 就作用于全局名称空间
# 名称空间的生成是从内置开始由大到小
作用域的查找顺序与之相反
2.简要概括什么是模块,导入模块的方式有哪些,导入模块会发生什么事情
模块就是别人或者自己提前写好了的文件或者文件合计可以拿来调用
通过
import 模块名 (as 起个别名)
from 位置用点隔开 import 模块名
这两种方法导入
导入之后会程序会开出一个导入模块的名称空间
在原有名称空间找不到或者通过.指定之后可以直接使用模块中数据
3.截至目前为止你所知道的内置模块有哪些,有哪些主要功能
时间模块
time.time() # 时间戳
time.strftime(%H : %M : %S) # 当前时间小时分钟秒
time.sleep() # 阻塞多久秒为单位
datetime.date.today # 今天日期
datetime.datetime.today # 今天具体时间
datetime.timedelta(days=90) # 根据现在时间向后90天,数字为负则向前推移a
复习巩固
- 名称空间与作用域
- 匿名函数
- 列表生成式
- 三元表达式
- 模块(重点)
内容概要
主体:内置模块
- os模块
操作系统打交道的模块
- hashlib模块
加密
- random
随机相关功能
抽奖 掷色子 洗牌
- logging模块
日志模块 类似于监控 记录
- json模块
不同编程语言数据交互的通用格式
详细讲解
强调
'''在创建py文件的时候文件名一定不能和模块名冲突'''
os模块
impot os
os.mkdir(r'文件夹名字') # 创建单级文件夹
os.makedirs(r'文件夹1\文件夹2') # 可以创建多级(单极当然也行
os.rmdir(r'文件夹名字') # 默认只能删除一级目录
os.removedirs(r'文件夹1\文件夹2') # 可以删除多级目录
os.listdir('路径\\') # 查看指定路径下所有的文件及文件夹
os.getcwd() # 查看当前所在路径
os.chdir(r'路径') # 切换当前路径
os.path.isdir(r'文件所在路径') # 判断是否是文件夹
os.path.isfile(r'文件所在路径') # 判断是否是文件
os.path.exists(r'') # 判断当前路径是否存在
'''不同的操作系统路径之间分隔符是不一样的'''
os.path.join() # 可以针对不同操作系统完成路径拼接
os.path.getsize(r'') # 数字节数
hashlib模块
加密模块
将明文数据按照一定的逻辑变成密文
一般情况下密文都是由数字字母随机组合而成
加密算法
将明文数据按照一定的逻辑(每个算法逻辑都不一样)
加密后的密文不能反解出明文
# 常见加密算法:md5 base64 hmac sha系列
'''算法生成的密文越长表示该算法越复杂'''
import hashlib
# 选择加密算法:一般情况下采用md5即可
md5 = hashlib.md5() # 选择加密算法:一般情况下采用md5即可 导入调用模块里MD5加密
md5.update(b'0322') # 将待加密的数据传入算法中 数据必须是bytes类型(二进制) 所以如果是纯英文或者数字的就在字符串前加个b 中文就只能编码了
res = md5.hexdigest() # 获取加密之后的密文
print(res)
import hashlib
md5 = hashlib.md5()
# 加盐处理:在对用户真实数据加密之前再往里添加额外的干扰数据 从而防止用户自己写的密码太简单
md5.update('自己定制的盐'.encode('utf8')) # 注意.update相当于自带一个添加功能不用再额外操作
md5.update(b'0322') # 数据必须是bytes类型(二进制)
res = md5.hexdigest()
print(res)
# 还有一种叫做动态加盐的东西
import hashlib
md5 = hashlib.md5()
md5.update('random_num'.encode('utf8')) # 相比与加盐 这里的盐变成了一个不固定的数据 就会更难破解
md5.update(b'0322')
res = md5.hexdigest()
print(res)
random模块
import random
print(random.random()) # 随机返回0-1之间的小数
print(random.randint(0,9)) # 随机返回0到9之间的整数包括首位
print(random.choices(['真心话','大冒险','扣血'])) # 从给定元素中随机抽一个
print(random.sample([1, 2, 3, 4, 5, 6, 7, 8, 9], 3)) # 随机抽样 从给定数据中抽取两个
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 'joker', 'faker']
random.shuffle(l) # 随机打乱列表l中数据
'''
小练习:做一个函数实现以下功能
产生一个五位数随机验证码
每一位都可以是数字\小写字母\大写字母
'''
# 下面是跟做完美版
import random
def get_rdmcode(figure): # 11.形参就可以设置一个想要几位随机验证码的数字 figure位数
random_code = '' # 8.2先把他定义成一个空的字符串之后让for循环里加给他
# 1.首先第一步每个值一定是要一个个取出的,那说道循环取出就先for写上
for i in range(figure):
# 2.每次都要从数字,小写英文字母,大写英文字母三个中先随机 那要把这三个的变量名定义出来
num = str(random.randint(0, 9)) # 3.数字定义的时候顺便加上也要随机取 7.转字符串
ngh_upper = chr(random.randint(65, 90)) # 4.去字母可以用ascii码随机拿对应的数字然后转成字母
ngh_lower = chr(random.randint(97, 122)) # 5.与上一步同理
co = random.choice([num, ngh_upper, ngh_lower]) # 6.对应第二步从三个里面选一个 注意这边用choice比较好,choices取出来的值是列表形式
# 这个时候取出来的是一个个的单个元素,所以就要去拼接,返回3去把数字统一换成字符串
# 8.1拼接完成的结果不应该被循环取用所以要在for循环外面定义出来
random_code += co # 9.每次循环取值到的co随机字符加给原来的random_code
# print(random_code) # 10.输出检验没问题要优化封装成函数版
return random_code # for取值完毕返回值所以这边return和for平齐 把结果返回
# 用的时候实参给位数 给个整型就可以
print(get_rdmcode(5))
logging模块
这个模块了解为主,不太用后端开发和运维才会比较常用
import logging
# 日志级别
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
# 这个级别由低到高最好可以记一下
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler,],
level=logging.ERROR
)
logging.error('你好')
import time
import logging
from logging import handlers
sh = logging.StreamHandler()
rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024,backupCount=5)
fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8')
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[fh,sh,rh],
level=logging.ERROR
)
for i in range(1,100000):
time.sleep(1)
logging.error('KeyboardInterrupt error %s'%str(i))
# 这是将文件分开写入 了解一下就好 要是到时候要用直接CV大法就行
import logging
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8')
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
# 这个较于前面增加了日志等级的
json模块
这个模块可以简单理解成将其他数据类型转化成字符串,还能再转回去
同时能实现 序列化:
将其他数据类型转化成json格式的字符串
只有json格式的字符串在执行界面是双引号 所以双引号就是判断json格式字符串的重要依据
d = {'username': 'leo', 'pwd': 123}
import json
res = json.dumps(d) # 注意结果中的引号
print(res, type(res)) # {"username": "leo", "pwd": 123} <class 'str'>
d1 = {"username": "leo", "pwd": 123} # 自己打双引号试试
print(d1) # {'username': 'leo', 'pwd': 123} 结果还是单引号
res1 = json.loads(res) # 转换回来
print(res1, type(res1)) # {'username': 'leo', 'pwd': 123} <class 'dict'>
后半部分称之为反序列化
将json格式字符串转换成其他对应的数据类型
import json
d = {'username': 'leo', 'pwd': 123}
with open(r'a.txt', 'w', encoding='utf8') as f:
json.dump(d, f) # 前面放要写入的元素 逗号后面放要放进哪里
import json
d = {'username': 'leo', 'pwd': 123}
with open(r'a.txt', 'r', encoding='utf8') as f:
res = json.load(f)
print(res, type(res))
但是并不是所有数据类型都可以转化成json格式
大部分常用数据类型是可以的 详情对比下表
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
作业
1.今日博客书写
2.周日下午做周总结
总结思路按照老师上课书写笔记的思路
3.优化之前书写的登录注册功能
1.存储用户数据的文件自动创建
2.将用户注册的数据采用json格式存储
每个用户一个json文件