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       # 设置自动提交
)

 

posted on   gjwqz  阅读(11)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示