一周总结
0830(周一)小测验
随机验证码
import random
code = ''
n = int(input('位数>>:'))
for i in range(n):
# 产生一个随机的数字
random_int = str(random.randint(0, 9))
# 产生一个随机的大写字母
random_upper = chr(random.randint(65, 90))
# 产生一个随机的小写字母
random_lower = chr(random.randint(97, 122))
# 三选一
tmp = random.choice([random_int, random_upper, random_lower])
code += tmp
print(code)
注册登录功能
import os
import hashlib
import json
def register():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
if len(username) == 0 or len(password) == 0:
print('用户名或密码不能为空')
return
# 1.先校验当前用户名是否已存在
# 1.1 先获取用户数据文件夹下面所有文件名称
all_list = os.listdir(r'用户数据') # ['jyb','tony']
# 1.2 循环比对文件名与用户名是否重复
if username in all_list:
print('用户名已存在')
return
# 2.对密码加密处理
md5 = hashlib.md5()
md5.update(password.encode('utf8'))
hash_pwd = md5.hexdigest()
# 3.构造用户数据并写文件
user_dict = {'username': username, 'password': hash_pwd}
file_path = os.path.join(r'用户数据', username)
with open(r'%s' % file_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
def login():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
if len(username) == 0 or len(password) == 0:
print('用户名或密码不能为空')
return
# 1.先判断用户名是否存在
all_list = os.listdir(r'用户数据')
if username not in all_list:
print('用户名不存在')
return
# 2.用户存在则校验密码是否一致
md5 = hashlib.md5()
md5.update(password.encode('utf8'))
input_pwd = md5.hexdigest()
file_path = os.path.join(r'用户数据', username)
with open(r'%s' % file_path, 'r', encoding='utf8') as f:
json_data = json.load(f)
real_pwd = json_data.get('password')
# 3.比对两者加密之后的密码是否一致
if input_pwd == real_pwd:
print("登录成功")
else:
print('密码错误')
func_dict = {'1': register, '2': login}
# 先判断存储用户数据的文件夹是否存在 不存在则创建
if not os.path.exists(r'用户数据'):
os.mkdir(r'用户数据')
while True:
print("""
1.注册
2.登录
""")
choice = input('请选择您想要执行的功能>>>:')
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('当前没有该功能 请输入正确的功能序号')
0831(周二)内容概要
- 面向对象
- 网络爬虫
- MySQL数据库
- MongoDB数据库
0831内容详细
面向对象:一切皆对象
对象:数据与功能的结合体
类:多个对象相同数据与功能的结合体
# 在程序中需要先定义类 之后才能产生对象
# 定义类
class Student:
# 相同的数据
school = '清华大学'
# 相同的功能
def choose_course(self):
print('选课')
"""
定义类的语法结构
1.class是定义类的关键字
2.Student是类的名字
类名在python中推荐首字母大写
3.缩进代码块
对象相同的数据和功能
强调:在类中定义的函数我们称之为>>>:方法
"""
# 产生对象:类名加括号(实例化)
obj1 = Student() # 每次都会产生一个新的对象
obj2 = Student()
obj3 = Student()
print(id(obj1), id(obj2), id(obj3))
访问数据和功能
# 查看内部具有的属性和方法
print(Student.__dict__)
print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
# 调用属性和方法(句点符)
print(obj1.school)
print(obj2.school)
print(obj3.school)
print(obj1.choose_course())
print(obj2.choose_course())
print(obj3.choose_course())
独有的数据
# 定义类
class Student:
school = '男德学院'
# 让对象具有独有的数据
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# 绑定给对象的方法(绑定方法):对象来调用自动将对象当作参数传入
def choose_course(self):
print('%s正在选课' % self.name)
# 产生对象:类名加括号(实例化)
obj1 = Student('jyb', 18, 'male') # 每次都会产生一个新的对象
obj2 = Student('kevin', 28, 'male')
obj3 = Student('tony', 38, 'female')
# 1.为什么调用的时候形参self不需要传值 2.形参self到底是谁
"""
对象在调用类里面定义的方法的时候
会自动将对象本身当成第一个位置参数传入
形参self指代的就是一个个对象
"""
# obj1.choose_course()
# obj2.choose_course()
# obj3.choose_course()
print(obj1.name)
obj1.name = 'jybNB'
print(obj1.name)
obj1.xxx = 'ooo'
print(obj1.xxx)
核心补充
1.父类:多个类相同的数据和功能的结合体
2.继承:一个类可以继承多个父类并拥有多个父类里面所有的东西
3.对象查找数据和方法的顺序
先从对象自身开始找 再去产生对象的类里面找 再去父类里面找
异常捕获
异常的分类
1.语法错误
不被允许的 出现了应该立刻修改
2.逻辑错误
可以允许发生的(bug)
语法结构
try:
被检测的代码
except 错误类型 as 变量名:
分支代码(变量名指代的就是错误的具体信息)
# 万能异常Exception/BaseException
1.异常在程序中尽量少用
2.try检测的代码要尽可能的少
其他关键字
else
try被检测的代码没有异常的情况下会走
finally
无论是否有异常最终都会执行
0901(周三)内容概要
主体:数据库MySQL(重要)
- 数据库简介
- 软件开发架构
- 数据库的分类
- SQL语句的由来
- MySQL数据库简介
- MySQL下载与安装
0901内容详细
数据库简介
数据库存储数据的演变过程
1.文件
jyb|123 # 普通文本
{"username":"jyb","pwd":123} # json格式
"""
缺陷
1.数据格式千差万别 导致程序兼容性很差
2.数据安全性较弱 容易丢失
"""
2.单机游戏
数据保存在本地的一个文件夹内 数据格式由程序设计者定义好
"""
缺陷
1.数据彼此之间无法共享
eg:游戏进度 用户数据
2.数据安全性较弱 容易丢失
"""
3.网络游戏
数据保存在你暂时不知道的地方 数据是可以共享的 并且安全性较高
软件开发架构
1.c/s架构
c:client 客户端
s:server 服务端
eg:
客户端相当于是要去店里消费的客人 服务端相当于是一家家店
2.b/s架构
b:broswer 浏览器
s:server 服务器(端)
eg:
浏览器相当于是可以去多家店里消费的客人 服务器相当于是一家家店
# b/s架构本质也是c/s架构
数据库概念
数据库其实就是一款c/s架构的软件
# 数据库操作数据可以简单的理解为就是基于网络远程的操作文件
客户端
基于网络通信(可以是互联网 也可以是局域网 甚至是单机)
服务端
基于网络通信(可以是互联网 也可以是局域网 甚至是单机)
数据库的分类(非常重要)
由于数据库就是一款c/s架构的软件 所以数据库软件其实有很多
1.关系型数据库
具有固定的表结构 并且表与表之间可以建立外键关系
MySQL、Oracle、PostgreSQL、sql server、sqlite、MariaDB、access
1.MySQL数据库
开源免费的 也是目前市面上使用最多的一款数据库
2.MariaDB数据库
跟MySQL是同一个人开发的 相当于是MySQL的备用也有很多其他功能
3.Oracle数据库
安全性极高但是需要收费并且维护费用也很高
只有大型互联网企业才会使用 尤其是银行
4.PostgreSQL数据库
可扩展性非常强 可以基于现有的功能额外开发(改装)
5.sql server数据库
老牌的数据库软件
6.sqlite数据库
小型数据库 一般只用于本地小数据量测试
...
2.非关系型数据库
没有固定的表结构 数据存储格式采用的是K:V键值对的形式
redis、mongoDB、memcache
1.redis数据库
是目前市面上最火的一款非关系型数据库软件
2.mongoDB数据库
在爬虫和大数据库领域使用广泛
3.memcache数据库
基本都redis淘汰了
SQL语句与NoSQL语句
# SQL语句就是用来操作关系型数据库的语言
# NoSQL语句就是用来操作非关系型数据库的语言
由于可以充当数据库客户端的语言非常的多,为了能够兼容
数据库专门开发了一门用来与数据库打交道的语言>>>SQL语句
'''也就意味着以后需要操作数据库 统一使用SQL语句'''
重要概念
针对关系型数据库
库 >>> 文件夹
表 >>> 文件夹里面的文件
数据 >>> 文件夹里面的文件里面的一行行记录
# 数据库就是一款远程操作文件的软件
MySQL数据库
MySQL5.5 基本不用
MySQL5.6 使用较广泛
MySQL5.7 逐步过渡
MySQL8.0 最新版
# 版本不影响我们学习SQL语句
"""
我们在学习阶段MySQL客户端和服务端全部下载到本地机器
等进入公司之后服务端会单独拎出来 通过互联网、局域网访问
"""
官网
downloads
MySQL Community Downloads
MySQL Community Server
Archives
下拉框选择版本5.6即可下载对应的压缩包(一般都是64位)
下载完毕之后解压至容易找到的路径下(最好不要是C盘)
eg:
D:\
文件目录介绍
bin文件夹
存储的是启动程序文件
mysql.exe 客户端
mysqld.exe 服务端
data文件夹
存储的是数据相关的文件
my-default.ini
数据库的默认配置文件
README
类似于产品说明书
移除之前环境
1.以管理员身份打开cmd窗口
2.将MySQL服务关闭
net stop mysql
3.移除系统mysql服务端
mysqld --remove
4.删除MySQL相关环境变量
5.删除MySQL相关文件夹
# 之后下载压缩包从头开始
基本使用
1.要想使用MySQL必须先启动服务端
2.客户端登录服务端
mysql # 游客模式登录 功能及权限都很少!!!
3.退出游客账户采用管理员账户登录
exit\quit
"""进入公司之后每个人都会有自己的账户密码和权限"""
管理员用户名:root 初始没有密码
# 完整命令
mysql -h 127.0.0.1 -P 3306 -uroot -p
# 本地操作可以简化
mysql -uroot -p
系统服务制作
# 每次要使用MySQL都需要至少两个cmd窗口 太繁琐了
如果能够让MySQL的服务端变成系统服务 随着计算机的开启与关闭自动启动和停止
1.如何查看计算机内部所有的系统服务
方式1:鼠标移动到底部任务栏右键选择任务管理器查看服务即可
方式2:windows + r 并输入services.msc回车即可
2.将MySQL服务添加到系统服务中
一定要以管理员身份打开cmd
mysqld --install
3.添加完成后第一次需要手动启动
方式1:找到服务鼠标右键点击启动即可
方式2:net start mysql
"""过程中出现报错不要慌 百度搜索基本都可以搞定"""
0902(周四)内容概要
主体:数据库MySQL(重要)
- 数据库简介
- 软件开发架构
- 数据库的分类
- SQL语句的由来
- MySQL数据库简介
- MySQL下载与安装
0902内容详细
数据库简介
数据库存储数据的演变过程
1.文件
jyb|123 # 普通文本
{"username":"jyb","pwd":123} # json格式
"""
缺陷
1.数据格式千差万别 导致程序兼容性很差
2.数据安全性较弱 容易丢失
"""
2.单机游戏
数据保存在本地的一个文件夹内 数据格式由程序设计者定义好
"""
缺陷
1.数据彼此之间无法共享
eg:游戏进度 用户数据
2.数据安全性较弱 容易丢失
"""
3.网络游戏
数据保存在你暂时不知道的地方 数据是可以共享的 并且安全性较高
软件开发架构
1.c/s架构
c:client 客户端
s:server 服务端
eg:
客户端相当于是要去店里消费的客人 服务端相当于是一家家店
2.b/s架构
b:broswer 浏览器
s:server 服务器(端)
eg:
浏览器相当于是可以去多家店里消费的客人 服务器相当于是一家家店
# b/s架构本质也是c/s架构
数据库概念
数据库其实就是一款c/s架构的软件
# 数据库操作数据可以简单的理解为就是基于网络远程的操作文件
客户端
基于网络通信(可以是互联网 也可以是局域网 甚至是单机)
服务端
基于网络通信(可以是互联网 也可以是局域网 甚至是单机)
数据库的分类(非常重要)
由于数据库就是一款c/s架构的软件 所以数据库软件其实有很多
1.关系型数据库
具有固定的表结构 并且表与表之间可以建立外键关系
MySQL、Oracle、PostgreSQL、sql server、sqlite、MariaDB、access
1.MySQL数据库
开源免费的 也是目前市面上使用最多的一款数据库
2.MariaDB数据库
跟MySQL是同一个人开发的 相当于是MySQL的备用也有很多其他功能
3.Oracle数据库
安全性极高但是需要收费并且维护费用也很高
只有大型互联网企业才会使用 尤其是银行
4.PostgreSQL数据库
可扩展性非常强 可以基于现有的功能额外开发(改装)
5.sql server数据库
老牌的数据库软件
6.sqlite数据库
小型数据库 一般只用于本地小数据量测试
...
2.非关系型数据库
没有固定的表结构 数据存储格式采用的是K:V键值对的形式
redis、mongoDB、memcache
1.redis数据库
是目前市面上最火的一款非关系型数据库软件
2.mongoDB数据库
在爬虫和大数据库领域使用广泛
3.memcache数据库
基本都redis淘汰了
SQL语句与NoSQL语句
# SQL语句就是用来操作关系型数据库的语言
# NoSQL语句就是用来操作非关系型数据库的语言
由于可以充当数据库客户端的语言非常的多,为了能够兼容
数据库专门开发了一门用来与数据库打交道的语言>>>SQL语句
'''也就意味着以后需要操作数据库 统一使用SQL语句'''
重要概念
针对关系型数据库
库 >>> 文件夹
表 >>> 文件夹里面的文件
数据 >>> 文件夹里面的文件里面的一行行记录
# 数据库就是一款远程操作文件的软件
MySQL数据库
MySQL5.5 基本不用
MySQL5.6 使用较广泛
MySQL5.7 逐步过渡
MySQL8.0 最新版
# 版本不影响我们学习SQL语句
"""
我们在学习阶段MySQL客户端和服务端全部下载到本地机器
等进入公司之后服务端会单独拎出来 通过互联网、局域网访问
"""
官网
downloads
MySQL Community Downloads
MySQL Community Server
Archives
下拉框选择版本5.6即可下载对应的压缩包(一般都是64位)
下载完毕之后解压至容易找到的路径下(最好不要是C盘)
eg:
D:\
文件目录介绍
bin文件夹
存储的是启动程序文件
mysql.exe 客户端
mysqld.exe 服务端
data文件夹
存储的是数据相关的文件
my-default.ini
数据库的默认配置文件
README
类似于产品说明书
移除之前环境
1.以管理员身份打开cmd窗口
2.将MySQL服务关闭
net stop mysql
3.移除系统mysql服务端
mysqld --remove
4.删除MySQL相关环境变量
5.删除MySQL相关文件夹
# 之后下载压缩包从头开始
基本使用
1.要想使用MySQL必须先启动服务端
2.客户端登录服务端
mysql # 游客模式登录 功能及权限都很少!!!
3.退出游客账户采用管理员账户登录
exit\quit
"""进入公司之后每个人都会有自己的账户密码和权限"""
管理员用户名:root 初始没有密码
# 完整命令
mysql -h 127.0.0.1 -P 3306 -uroot -p
# 本地操作可以简化
mysql -uroot -p
系统服务制作
# 每次要使用MySQL都需要至少两个cmd窗口 太繁琐了
如果能够让MySQL的服务端变成系统服务 随着计算机的开启与关闭自动启动和停止
1.如何查看计算机内部所有的系统服务
方式1:鼠标移动到底部任务栏右键选择任务管理器查看服务即可
方式2:windows + r 并输入services.msc回车即可
2.将MySQL服务添加到系统服务中
一定要以管理员身份打开cmd
mysqld --install
3.添加完成后第一次需要手动启动
方式1:找到服务鼠标右键点击启动即可
方式2:net start mysql
"""过程中出现报错不要慌 百度搜索基本都可以搞定"""
0903(周五)内容概要
- 存储引擎
- 创建表的完整语法
- MySQL基本数据类型
- 字段的约束条件
0903内容详细
存储引擎
# 存储引擎
MySQL内部针对数据的存储有很多种不同的方式
简单的理解:我们把这些不同的存储方式叫做不同的存储引擎
# 如何查看各类存储引擎
show engines;
# 主要存储引擎
InnoDB
MySQL5.5之后的版本默认的存储引擎
支持事务、行锁、外键 >>> 数据更安全
"""
事务:保证多个数据的操作要么全部完成要么全部失败
行锁:多一行行数据加锁 同一时间只能有一个人操作
外键:建立表关系(后面详细的讲)
"""
MyISAM
MySQL5.5之前的版本默认的存储引擎
不支持事务、外键等功能 >>> 安全性较于InnoDB低
但是存取数据的速度比InnoDB快
memory
数据直接存储在内存 速度快但是断电立刻丢失
blackhole
写入其中的数据都会丢失
存储引擎表文件
create table t1(id int)engine=InnoDB;
create table t2(id int)engine=MyISAM;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;
# 不同的存储引擎生成的文件数目也不同
1.InnoDB有两个文件
.frm 表结构
.idb 表数据、索引(书的目录)
2.MyISAM有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引
3.memory有一个文件
.frm 表结构
4.blackhole有一个文件
.frm 表结构
# 存储数据特性
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
创建表的完整语法
create table 表名(
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件
);
"""
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可选 并且一个字段可支持多个约束条件
3.最后结尾的字段语句不能有逗号
"""
字段类型
# 整型
tinyint
smallint
int
bigint
'''不同整型类型能够存储的数字范围不同'''
验证整型是否自带正负号
create table t6(id tinyint);
insert into t6 values(-129),(256); # -127 128
# 其他类型也是如此 默认都是自带正负号
create table t7(id tinyint unsigned); # unsigned约束条件 无符号
insert into t7 values(-129),(256); # 0 255
# 浮点型
float
double
decimal
"""不同的浮点型存储小数的范围和精确度不一样"""
float(255,30) # 总共255位小数位占30位
double(255,30) # 总共255位小数位占30位
decimal(65,30) # 总共65位小数位占30位
create table t8(id float(255,30));
create table t9(id double(255,30));
create table t10(id decimal(65,30));
insert into t8 values(1.111111111111111111111111111111);
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
# 精确度:float < double < decimal
"""
精确度问题在很多场景下都会发生 有时候我们会采取不同的类型来存储
eg:
比如手机号全部是数字存储的时候应该使用整型 但是有时候我们使用字符类型
"""
# 字符类型
char
varchar
"""上述两个数据类型在存储数据上有本质的区别"""
char(4)
最多可以存储4个字符 超过了报错 没有超过也按照四个字符存储(默认空格填充)
varchar(4)
最多可以存储4个字符 超过了报错 没有超过则按照实际有几个字符存几个
create table t11(id int,name char(4));
create table t12(id int,name varchar(4));
insert into t11 values(1,'jyb');
insert into t12 values(1,'jyb');
# 5.6超出了范围没有报错是因为我们没有开启严格模式(5.7及之后版本默认都有)
# char_length() 统计数据长度
默认情况下MySQL会自动填充存储并在查询的时候自动去除填充的空格
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
"""思考题:char VS varchar"""
char
好处:整存整取 速度快
坏处:浪费存储空间
varchar
好处:节省存储空间
坏处:存取速度较于char慢
# 存取数据都需要计算 消耗时间
1bytes+tom1bytes+json1bytes+jack1bytes+osca
# 结论:两者都有应用场景 需要结合实际情况分析决定
严格模式
# 查看严格模式
show variables like '%mode%';
# 修改严格模式
set global sql_mode = 'strict_trans_tables';
# 只需要退出客户端重新进入即可
时间类型
date 年月日
time 时分秒
Datetime 年月日时分秒
Year 年
create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
# 针对时间数据很多时候都是自动获取 这里仅仅是演示一下
insert into student values(1,'jyb','2022','2022-05-09','11:11:00','2022-11-11 11:11:11');
枚举与集合类型
enum
多选一
set
多选多(包含多选一)
# 枚举类型
create table t13(
id int,
name varchar(16),
gender enum('male','female','others')
);
'''插入数据的时候只能够插入提前规定好的'''
insert into t13 values(1,'jyb','男'); # 报错
insert into t13 values(2,'tony','male');
# 集合类型
create table t14(
id int,
name char(16),
hobby set('basketball','football','doublecolorball')
);
'''插入数据的时候只能够插入提前规定好的'''
insert into t14 values(1,'jyb','read'); # 报错
insert into t14 values(2,'kevin','basketball'); # 可选一
insert into t14 values(3,'tony','basketball,football'); # 可选多
宽度说明
int(4) char(4)
# 针对数字类型 宽度并不是用来限制存储长度而是用来表示展示长度
"""
以后在定义数字的时候无需手动添加宽度
"""
约束条件
"""
插入数据两种方式
1.insert into t1 values() 按照字段顺序依次传入(一个都不能少)
2.insert into t1(id,name) values() 按照指定的字段传入(可以少)
"""
unsigned # 无符号
zerofill # 0填充
# not null 不能为空 使用频率很高
create table t18(
id int,
name varchar(16) not null
);
# default 默认值
create table t19(
id int,
name varchar(16) default '匿名用户'
);
# unique 唯一
'''单列唯一'''
create table t20(
id int,
name varchar(16) unique
);
'''多列唯一'''
create table t21(
id int,
host int,
port int,
unique(host,port)
);