Python学习6
类型注解
在代码中,设计数据交互时,对数据类型进行显式的说明。但一般,只在无法直接看出变量类型时添加变量的类型注解
可以帮助第三方IDE开发工具(pycharm等)对代码类型进行推断协助做代码提示;可以帮助开发者自身做类型的备注
类型注解:变量的类型注解;函数(方法)的形参和返回值的类型注解
注意:类型注解只是提示性的,并非决定性的。数据类型和注解类型不吻合也不会报错
注解的语法:
- 语法一: 变量:类型
# 演示变量的类型注解 # 方法一: var_1: int = 10 # 基础数据类型注解 var_2: str = "nihao" class Student: pass stu: Student = Student() # 类对象类型注解 my_lst: list = [1, 2, 3] # 基础容器类型注解 my_tuple: tuple = (1, 2, 3) my_list: list[int] = [1, 2, 3] # 容器类型详细注解 my_tuple: tuple[int, str, bool] = (1, "hello", True)
- 语法二:在注释中,# type:类型
# 演示变量的类型注解 # 方法二: import json import random var_1 = random.randint(1,10) # type:int var_2 = json.loads('{"name":"xiaoming"}') # type: dict[str, str] def func(): return 10 var_3 = func() # type: int
函数的类型注解:
分类: 形参的类型注解; 返回值的类型注解;
- 函数(方法)的类型注解—形参注解
语法:
def 函数方法名(形参名:类型,形参名:类型,......):
内容
- 函数(方法)的类型注解—返回值注解
语法:
def 函数方法名(形参:类型,......,形参:类型)—> 返回值类型:
内容
# 对返回值进行类型注解 def func(data: list) -> list: return data
- Union联合类型注解
Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用
语法: Union[ 类型,.......,类型 ]
多态
多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
多态常作用在继承关系上
比如:函数(方法)形参声明接收父类对象 实际传入父类的子类对象进行工作
即:以父类做定义声明 以子类做实际工作 用以获得同一行为,不同状态
class Animal: def speak(self): pass class Dog(Animal): def speak(self): print("汪汪汪") class Cat(Animal): def speak(self): print("喵喵喵") def make_noise(animal:Animal): # 制造点噪音,需要传入Animal对象 animal.speak() # 演示多态,使用2个子类对象来调用函数 dog = Dog() cat = Cat() make_noise(dog) # 结果是: 汪汪汪 make_noise(cat) # 结果是: 喵喵喵
抽象类(接口)
在上面父类Animal的speak方法,是空实现
这种设计的含义是:父类用来确定有哪些方法,具体的方法实现,由子类自行决定。 这种写法,就叫做抽象类(也可称之为接口)
抽象类:含有抽象方法的类 抽象方法:方法是空实现的(pass),即没有具体实现的方法
抽象类就好比定义一个标准,包含了一些抽象方法,要求子类必须实现。配合多态,完成:抽象的父类设计(设计标准);具体的子类设计(实现标准)
注意:抽象类是对子类的一种软性约束,要求子类必须复写父类的一些方法
# 演示抽象类 class AC: def cool_wind(self): pass def hot_wind(self): pass def swing_l_r(self): pass class Midea_AC(AC): def cool_wind(self): print("美的空调制冷") def hot_wind(self): print("美的空调制热") def swing_l_r(self): print("美的空调左右摆风") class GREE_AC(AC): def cool_wind(self): print("格力空调制冷") def hot_wind(self): print("格力空调制热") def swing_l_r(self): print("格力空调左右摆风") def make_cool(ac: AC): ac.cool_wind() midea_ac = Midea_AC() gree_ac = GREE_AC() make_cool(midea_ac) # 结果: 美的空调制冷 make_cool(gree_ac) # 结果: 格力空调制冷
数据库
数据库就是指数据存储的库,作用就是组织数据并存储数据。按照:库-> 表-> 数据 三个层级进行组织
数据库软件就是提供库->表->数据,这种数据组织形式的工具软件,也称之为数据库管理系统
常见的数据库软件:Oracle, MySQL, SQL Server, PostgreSQL, SQLite
数据库(软件)提供数据组织存储的能力,SQL语句则是操作数据,数据库的工具语言.
图形化工具:
使用命令提示符进行MySQL的操作,并不方便,一般开发者都会使用第三方的图形化工具进行使用
可用于MySQL的图形化工具非常多,接下来使用:DBeaver
SQL语言的分类: DDL数据定义; DML数据操作; DCL数据控制; DQL数据查询。
SQL基础与DDL
SQL全称:Structured Query Language 结构化查询语言,用于访问和处理数据库的标准的计算机语言。
SQL语言1974年有Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。
注意:SQL语言,大小写不敏感;SQL可以单行或多行书写,最后以 ; 号结束
注释
- 单行注释:-- 注释内容(--后面一定要有一个空格)
- 单行注释:# 注释内容(#后面可加可不加空格)
- 多行注释:/* 注释内容 */
基础命令:
查看数据库: show databases; 使用数据库: use 数据库名称; 创建数据库: create database 数据库名称 [ charset UTF-8 ]
删除数据库: drop database 数据库名称; 查看当前使用的数据库:select database( );
注意:SQL中字符串的值,出现在SQL语句中,必须要用单引号包围起来
DDL-表管理
查看有哪些表: show tables; (注意:要先选择数据库 use 数据库名称) 删除表: drop table 表名称; drop table if exists 表名称;
创建表:
列类型有:
int 整数; float 浮点数; varchar(长度) 文本,长度为数字,做最大长度限制; date 日期类型; timestamp 时间戳类型
- 数据插入
语法:
示例:
use world; create table student( id int, name varchar(20), age int ); # 仅插入id列数据 insert into student (id) values(1001), (1002), (1003) # 插入全部列数据 insert into student (id, name, age) values(1004, '小明', 17), (1005, '小红', 16);
- 数据删除delete
基础语法: delete from 表名称 [ where 条件判断 ] ;
# 删除id=1002的数据 delete from student where id = 1002;
- 增加数据列alter
建完表后,想在某个字段后增加一个字段,SQL语句格式为:
alter table 表名称 add 列名称 varchar(20) after 列名称
注意:在某段之前可以用before
# 在age列后面增加一个gender列 alter table student add gender varchar(10) after age;
- 数据更新update
基础语法:update 表名 set 列=值 [ where 条件判断 ];
# 更新id=1003 的name 为 小李 update student set name = '小李' where id = 1003
SQL - DML
- 基础数据查询
基础语法: select 字段列表 from 表; select 字段列表 from 表 where 条件判断;
# 查询id 和 name 两个列 select id, name from student; # 查询id = 1004 的名字 select name from student where id = 1004
SQL - DQL
- 分组聚合
分组聚合应用场景非常之多,应用语法:
select 字段 | 聚合函数 from 表 [ where 条件 ] group by 列
聚合函数:求和: sum(列); 求平均值: avg(列); 求最小值:min(列); 求最大值:max(列); 求数量:count(列);
注意: group by 中出现了哪个列,哪个列才能出现在select 中的非聚合中(avg...就是聚合)例如此处gender, 换做其他列都不可以
# 以gender进行分组聚合 并对age求平均 # select 后面写gender是因为想要在结果前面显示性别 select gender, avg(age) from student group by gender;
- 结果排序
可以对结果的查询,使用order by 关键字,指定某个列进行排序。
语法:
注意: ASC (升序)将结果从最低值排序到最高值,而 DESC (降序)将结果集从最高值排序到最低值。如果未明确指定 ASC 或DESC ,则SQL Server将默认使用 ASC 来排序顺序。
# 对于表中age>15的学生进行升序排序 select * from student where age > 15 order by age asc;
- 结果分页限制
语法:
limit 关键字,是对查询结果进行数量限制
# 查找表中3条数据 select * from student limit 3;
# 查找表从第2条下面开始的2条数据 select * from student limit 2,2;
# 查找表中大于15岁的每个年龄阶段的总数量 select age, count(*) from student where age > 15 group by age
# 查找表中大于15岁的每个年龄阶段的总数量 并对年龄从小到大进行排序展示 select age, count(*) from student where age > 15 group by age order by age;
注意:
where、group by、order by、limit均可按需求省略; select 和 from是必写的
执行顺序:from -> where -> group by 和 聚合函数 -> select -> order by -> limit
Python和MySQL
除了使用图形化工具以外,我们也可以使用编程语言来执行SQL,从而操作数据库。
Python中,使用第三方库:pymysql来完成对MySQL数据库的操作
安装: pip install pymysql
- 创建到MySQL的数据库连接
# 演示Python pymysql库的基本操作 from pymysql import Connection # 构建到MySQL数据库的链接 conn = Connection( host = "localhost" , # 主机名(ID) port = 3306, # 端口 user = "root", # 账户 password = "123123" # 密码 ) print (conn.get_server_info()) # 关闭链接 conn.close()
- 执行SQL语句
# 演示Python pymysql库的基本操作 from pymysql import Connection # 构建到MySQL数据库的链接 conn = Connection( host = "localhost" , # 主机名(ID) port = 3306, # 端口 user = "root", # 账户 password = "12312312" # 密码 ) # 执行费查询性质SQL cursor = conn.cursor() # 获取到游标对象 # 选择数据库 conn.select_db("world") # 执行sql cursor.execute("create table test_pymysql(id int)") # 关闭链接 conn.close()
- 执行查询性质的SQL语句
通过连接对象调用cursor()方法,得到游标对象
游标对象.execute( )执行SQL语句
游标对象.fetchall( )得到全部的查询结果 封装到元组内
# 演示Python pymysql库的基本操作 from pymysql import Connection # 构建到MySQL数据库的链接 conn = Connection( host = "localhost" , # 主机名(ID) port = 3306, # 端口 user = "root", # 账户 password = "12312312" # 密码 ) # 执行费查询性质SQL cursor = conn.cursor() # 获取到游标对象 # 选择数据库 conn.select_db("world") # 执行sql cursor.execute("select * from student") results = cursor.fetchall() # 获得查询结果 print(results) # 结果是:((1004, '小明', 17, '男'), (1005, '小红', 16, '女'), (1001, '小黄', 18, '女'), (1003, '小李', 19, '男')) # 关闭链接 conn.close()
commit()确认
pymysql在执行数据插入或者其他产生的数据更改的SQL语句时,默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。
通过链接对象.commit( )即可确认此行为
from pymysql import Connection conn = Connection( host = "localhost", port = 3306, user = "root", password = "12312312" ) cursor = conn.cursor() conn.select_db("world") cursor.execute("insert into student values(1007, '小许', 17, '男')") # 通过commit确认 conn.commit() # 关闭链接 conn.close()
自动commit
如果不想手动确认,可以在构建链接对象的时候,设置自动commit的属性
from pymysql import Connection conn = Connection( host = "localhost", port = 3306, user = "root", password = "12312312", autocommit = True # 设置自动提交 )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话