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)
);