Python学习打卡:day17
day17
笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了
目录
- day17
- 121、Python 操作 MySQL 基础使用
- pymysql
- 创建到 MySQL 的数据库链接
- 执行 SQL 语句
- 执行非查询性质的SQL语句
- 执行查询性质的SQL语句
- 122、Python 操作 MySQL 数据的插入
- 自动 commit
- 123、综合案例
- 案例需求
- DDL 定义
- 实现步骤
- Python 高阶技巧
- 1、闭包
- 基础概念
- 简单闭包
- 修改外部函数变量的值
- 使用闭包实现 ATM 小案例
- 2、装饰器
- 装饰器的一般写法(闭包写法)
- 装饰器的语法糖写法
- 3、单例模式
- 4、工厂模式
- 5、多线程并行执行概念
- 进程、线程
- 并行执行
- 6、多线程编程
121、Python 操作 MySQL 基础使用
pymysql
在Python中,使用第三方库:pymysql 来完成对MySQL数据库的操作。
安装:
1、pip install pymysql;
2、或者 PyCharm中安装包 PyMySQL(使用清华源:https://pypi.tuna.tsinghua.edu.cn/simple)。
创建到 MySQL 的数据库链接
"""
演示 Python pymysql库的基础操作
"""
from pymysql import Connection# 构建到 MySQL数据库的链接
conn = Connection(host = "localhost", # 主机名(IP)port = 3306, # 端口user= 'root', # 账户password= '666666' # 密码
)# 打印 MySQL 数据库软件信息
# 验证是否连接上指定数据库
print(conn.get_server_info())# 关闭链接
conn.close()
执行 SQL 语句
执行非查询性质的SQL语句
示例代码如下:
"""
演示 Python pymysql库的基础操作
"""
from pymysql import Connection# 构建到 MySQL数据库的链接
conn = Connection(host = "localhost", # 主机名(IP)port = 3306, # 端口user= 'root', # 账户password= '666666' # 密码
)# # 打印 MySQL 数据库软件信息
# # 验证是否连接上指定数据库
# print(conn.get_server_info())# 执行非查询性质的 SQL
cursor = conn.cursor() # 获取到游标对象# 选择数据库
conn.select_db("test")
# 执行 sql
cursor.execute("create table test_pymysql (id int);")# 关闭链接
conn.close()
执行查询性质的SQL语句
"""
演示 Python pymysql库的基础操作
"""
from pymysql import Connection# 构建到 MySQL数据库的链接
conn = Connection(host = "localhost", # 主机名(IP)port = 3306, # 端口user= 'root', # 账户password= '666666' # 密码
)# print(conn.get_server_info())# 执行非查询性质的 SQL
# 获取到游标对象
cursor = conn.cursor() # # 选择数据库
# conn.select_db("test")
# # 执行 sql
# cursor.execute("create table test_pymysql (id int);")# 选择数据库
conn.select_db("world")
# 使用游标对象,执行 sql 语句
cursor.execute("select * from student_1")
# 获取查询结果
results = cursor.fetchall()
for r in results:print(r)# 关闭链接
conn.close()
122、Python 操作 MySQL 数据的插入
直接使用:
cursor.execute("insert into student_2 values(10002, '林俊杰', 31, '男')")
经过执行是无法将数据插入到数据表 student 中的。
因为:pymysql在执行数据插入或其它产生数据更改的SQL语句时,默认是需要提交更改的,即,需要通过代码“确认”这种更改行为。通过链接对象.commit() 即可确认此行为。
示例代码:
"""
演示使用 pymysql 库进行数据插入的操作
"""
from pymysql import Connection# 构建到 MySQL数据库的链接
conn = Connection(host = "localhost", # 主机名(IP)port = 3306, # 端口user= 'root', # 账户password= '666666', # 密码
)# 执行非查询性质的 SQL
cursor = conn.cursor() # 获取到游标对象# 选择数据库
conn.select_db("world")
# 执行 sql
cursor.execute("insert into student_2 values(10002, '林俊杰', 31, '男')")# 通过 commit 确认
conn.commit()# 关闭链接
conn.close()
自动 commit
如果不想手动commit确认,可以在构建链接对象的时候,设置自动commit的属性。
示例代码:
# 构建到 MySQL数据库的链接
conn = Connection(host = "localhost", # 主机名(IP)port = 3306, # 端口user= 'root', # 账户password= '666666', # 密码autocommit=True # 自动提交(确认)
)
123、综合案例
案例需求
我们使用《面向对象》章节案例中的数据集,完成使用Python语言,读取数据,并将数据写入MySQL的功能。

DDL 定义
本次需求开发我们需要新建一个数据库来使用,数据库名称:py_sql
基于数据结构,可以得到建表语句:
create table orders(
order_date date,
order_id varchar(255),
money int,
province varchar(10)
);
实现步骤

示例代码:
DBeaver:
create database py_sql charset utf8;use py_sql;create table orders(
order_date date,
order_id varchar(255),
money int,
province varchar(10)
);
Python:
"""
SQL 综合案例,读取文件,写入 MySQL 数据库中
"""from file_define import TextFileReader, JsonFileReader
from data_define import Record
from pymysql import Connectiontext_file_reader = TextFileReader("E:/3code/PyCharm/pythonProject/mysql/03_综合案例/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("E:/3code/PyCharm/pythonProject/mysql/03_综合案例/2011年2月销售数据JSON.txt")jan_data: list[Record] = text_file_reader.read_data()
feb_data: list[Record] = json_file_reader.read_data()# 将 2 个月份的数据合并为 1 个 list 来存储
all_data: list[Record] = jan_data + feb_data
print(all_data)# 构建 MySQL 链接对象
conn = Connection(host='localhost',port=3306,user='root',password='666666',autocommit=True
)# 获得游标对象
cursor = conn.cursor()# 选择数据库
conn.select_db("py_sql")# 组织 SQL 语句
for record in all_data:sql = (f"insert into orders(order_date, order_id, money, province) " f"values('{record.date}', '{record.order_id}', '{record.money}', '{record.province}')")# print(sql)# 执行 SQL 语句cursor.execute(sql)# 关闭 MySQL 链接对象
Python 高阶技巧
1、闭包
基础概念
通过全局变量account_amount来记录余额
尽管功能实现是ok的,但是仍有问题:
- 代码在命名空间上(变量定义)不够干净、整洁
- 全局变量有被修改的风险
因此:
- 将变量定义在函数内部是行不通
- 我们需要使用闭包
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
简单闭包

示例代码:
# 简单闭包
def outer(logo):def inner(msg):print(f"<{logo}>{msg}<{logo}>")return innerfn1 = outer("黑马程序员")
fn1("welcome")
修改外部函数变量的值

示例代码:
# 使用 nonlocal 关键字修改外部函数的值
def outer(num1):def inner(num2):nonlocal num1num1 += num2print(num1)return innerfn = outer(10)
fn(10)
fn(20)
fn(20)
fn(20)
使用闭包实现 ATM 小案例
"""
演示 Python 的闭包特性
"""
# 使用闭包实现 ATM 小案例
def account_create(initial_account = 0):def atm(num, deposit=True):nonlocal initial_accountif deposit:initial_account += numprint(f"存款, +{num}, 账户余额:{initial_account}")else:initial_account -= numprint(f"存款, -{num}, 账户余额:{initial_account}")return atmatm = account_create()atm(100)
atm(200)
atm(100, deposit=False)
tips:
优点,使用闭包可以让我们得到:
- 无需定义全局变量即可实现通过函数,持续的访问、修改某个值
- 闭包使用的变量的所用于在函数内,难以被错误的调用修改
缺点:
- 由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存
2、装饰器
装饰器其实也是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。
装饰器的一般写法(闭包写法)
示例代码:
# 装饰器的一般写法(闭包)
def outer(func):def inner():print("我睡觉了")func()print("我起床了")return innerdef sleep():import randomimport timeprint("睡眠中......")time.sleep(random.randint(1, 5))fn = outer(sleep)
fn()
定义一个闭包函数, 在闭包函数内部:
- 执行目标函数
- 并完成功能的添加
执行结果:
# 结果
我睡觉了
睡眠中......
我起床了
装饰器的语法糖写法
def outer(func):def inner():print("我睡觉了")func()print("我起床了")return inner@outer
def sleep():import randomimport timeprint("睡眠中......")time.sleep(random.randint(1, 5))sleep()
使用@outer
定义在目标函数sleep之上
执行结果:
# 结果
我睡觉了
睡眠中......
我起床了
3、单例模式
某些场景下, 我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例,用以节省创建类对象的开销和内存开销,比如某些工具类,仅需要1个实例,即可在各处使用。
这就是单例模式所要实现的效果。
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。
在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
- 定义:保证一个类只有一个实例,并提供一个访问它的全局访问点;
- 适用场景:当一个类只能有一个实例,而客户可以从一个众所周知的访问点访问它时。
单例的实现模式:

4、工厂模式
当需要大量创建一个类的实例的时候, 可以使用工厂模式。
即,从原生的使用类的构造去创建对象的形式迁移到,基于工厂提供的方法去创建对象的形式。
例如:由

转到

上述示例使用工厂类的get_person()方法去创建具体的类对象
优点:
- 大批量创建对象的时候有统一的入口,易于代码维护;
- 当发生修改,仅修改工厂类的创建方法即可;
- 符合现实世界的模式,即由工厂来制作产品(对象)。
示例代码:
"""
演示 设计模式之工厂模式
"""
class Person:passclass Worker(Person):passclass Student(Person):passclass Teacher(Person):passclass PersonFactory:def get_person(self, p_type):if p_type == 'w':return Worker()elif p_type == 's':return Student()else:return Teacher()pf = PersonFactory()
worker = pf.get_person('w')
stu = pf.get_person('s')
teacher = pf.get_person('t')
5、多线程并行执行概念
进程、线程
进程: 就是一个程序,运行在系统之上,那么便称之这个程序为一个运行进程,并分配进程ID方便系统管理。
线程:线程是归属于进程的,一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位。
进程就好比一家公司,是操作系统对程序进行运行管理的单位;
线程就好比公司的员工,进程可以有多个线程(员工),是进程实际的工作者。
操作系统中可以运行多个进程,即多任务运行;
一个进程内可以运行多个线程,即多线程运行。
tips:
进程之间是内存隔离的, 即不同的进程拥有各自的内存空间。 这就类似于不同的公司拥有不同的办公场所。
线程之间是内存共享的,线程是属于进程的,一个进程内的多个线程之间是共享这个进程所拥有的内存空间的。
这就好比,公司员工之间是共享公司的办公场所。

并行执行
并行执行的意思指的是同一时间做不同的工作。
进程之间就是并行执行的,操作系统可以同时运行好多程序,这些程序都是在并行执行。
除了进程外,线程其实也是可以并行执行的。
也就是比如一个Python程序,其实是完全可以做到:
- 一个线程在输出:你好
- 一个线程在输出:Hello
像这样一个程序在同一时间做两件乃至多件不同的事情, 我们就称之为:多线程并行执行
6、多线程编程
基本语法:


单线程:
示例代码:
"""
演示 多线程编程的使用
"""import timedef sing():while True:print("我在唱歌,啦啦啦...")time.sleep(1)def dance():while True:print("我在跳舞,呱呱呱...")time.sleep(1)if __name__ == '__main__':sing()dance()# 结果
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
我在唱歌,啦啦啦...
单方面循环 sing()
多线程:
"""
演示 多线程编程的使用
"""import time
import threadingdef sing():while True:print("我在唱歌,啦啦啦...")time.sleep(1)def dance():while True:print("我在跳舞,呱呱呱...")time.sleep(1)if __name__ == '__main__':# 创建一个唱歌线程sing_thread = threading.Thread(target=sing)# 创建一个跳舞线程dance_thread = threading.Thread(target=dance)# 进程启动sing_thread.start()dance_thread.start()# 结果
我在唱歌,啦啦啦...
我在跳舞,呱呱呱...
我在唱歌,啦啦啦...我在跳舞,呱呱呱...我在唱歌,啦啦啦...我在跳舞,呱呱呱...我在跳舞,呱呱呱...
我在唱歌,啦啦啦...
多线程传参:
需要传参的话可以通过:
- args参数通过元组(按参数顺序)的方式传参
- 或使用kwargs参数用字典的形式传参
示例代码:
"""
演示 多线程编程的使用
"""import time
import threadingdef sing(msg):while True:print(msg)time.sleep(1)def dance(msg):while True:print(msg)time.sleep(1)if __name__ == '__main__':# 创建一个唱歌线程sing_thread = threading.Thread(target=sing, args=("我要唱歌,哈哈哈",))# 创建一个跳舞线程dance_thread = threading.Thread(target=dance, kwargs={"msg":"我在跳舞,啦啦啦"})# 进程启动sing_thread.start()dance_thread.start()# 结果
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我要唱歌,哈哈哈我在跳舞,啦啦啦我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦我要唱歌,哈哈哈
相关文章:
Python学习打卡:day17
day17 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day17121、Python 操作 MySQL 基础使用pymysql创建到 MySQL 的数据库链接执行 SQL 语句执行非查询性质的SQL语句执行查询性质的SQL语句 122、Pyth…...
Spring Cloud Gateway 与 Nacos 的完美结合
在现代微服务架构中,服务网关扮演着至关重要的角色。它不仅负责路由请求到相应的服务,还承担着诸如负载均衡、安全认证、限流熔断等重要功能。Spring Cloud Gateway 作为 Spring Cloud 生态系统中的一员,以其强大的功能和灵活的配置ÿ…...
vue2 element ui 表单 动态增加表单项 表单项值不可重复 select多选
案例 <template><el-form :model"form" ref"form" label-width"70px"><el-form-item><el-button icon"el-icon-plus" type"primary" plain click"add">新增</el-button><el-b…...
[数据集][目标检测]电力场景下电柜箱门把手检测数据集VOC+YOLO格式1167张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1167 标注数量(xml文件个数):1167 标注数量(txt文件个数):1167 标注…...
OverTheWire Bandit 靶场通关解析(上)
介绍 OverTheWire Bandit 是一个针对初学者设计的网络安全挑战平台,旨在帮助用户掌握基本的命令行操作和网络安全技能。Bandit 游戏包含一系列的关卡,每个关卡都需要解决特定的任务来获取进入下一关的凭证。通过逐步挑战更复杂的问题,用户可…...
【Python实战因果推断】4_因果效应异质性4
目录 Cumulative Gain Target Transformation Cumulative Gain 如果采用与累积效应曲线完全相同的逻辑,但将每个点乘以累积样本 Ncum/N,就会得到累积增益曲线。现在,即使曲线的起点具有最高的效果(对于一个好的模型来说&#x…...
大模型推理知识总结
一、大模型推理概念 大多数流行的only-decode LLM(例如 GPT-3)都是针对因果建模目标进行预训练的,本质上是作为下一个词预测器。这些 LLM 将一系列tokens作为输入,并自回归生成后续tokens,直到满足停止条件࿰…...
[笔记] keytool 导入服务器证书和证书私钥
背景 我当前手头已有一个服务器证书和对应的私钥,现在需要转换为 Java KeyStore 格式使用,找了一大圈才发现 keytool 无法直接导入服务器证书和私钥,当然证书可以直接导入,但是私钥是无法直接导入。找了一大圈发现可以先将服务器…...
【2024-热-办公软件】ONLYOFFICE8.1版本桌面编辑器测评
在今日快速发展的数字化办公环境中,选择一个功能全面且高效的办公软件是至关重要的。最近,我有幸体验了ONLYOFFICE 8.1版本的桌面编辑器,这款软件不仅提供了强大的编辑功能,还拥有众多改进,让办公更加流畅和高效。在本…...
C# 23设计模式备忘
创建型模式:单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型&…...
STL中的迭代器模式:将算法与数据结构分离
目录 1.概述 2.容器类 2.1.序列容器 2.2.关联容器 2.3.容器适配器 2.4.数组 3.迭代器 4.重用标准迭代器 5.总结 1.概述 在之前,我们讲了迭代器设计模式,分析了它的结构、角色以及优缺点: 设计模式之迭代器模式-CSDN博客 在 STL 中&a…...
TCP、UDP详解
目录 1.区别 1.1 概括 1.2 详解 2.TCP 2.1 内容 2.2 可靠传输 2.2.1 确认应答 2.2.2 超时重传 2.2.3 连接管理 三次握手 四次挥手 2.2.4 滑动窗口 2.2.5 流量控制 2.2.6 拥塞控制 2.2.7 延时应答 2.2.8 捎带应答 2.2.9 面向字节流 2.2.10 异常情况的处理 1.…...
【脚本工具库】批量下采样图像(附源码)
在图像处理领域,我们经常需要对大批量图像进行下采样操作,以便减小图像的尺寸和文件大小,这对于节省存储空间和提高处理速度非常有帮助。手动操作不仅耗时,而且容易出错。为了解决这个问题,我们可以编写一个Python脚本…...
Web渗透:文件包含漏洞
Ⅱ.远程文件包含 远程文件包含漏洞(Remote File Inclusion, RFI)是一种Web应用程序漏洞,允许攻击者通过URL从远程服务器包含并执行文件;RFI漏洞通常出现在动态包含文件的功能中,且用户输入未经适当验证和过滤。接着我…...
什么是yum源?如何对其进行配置?
哈喽,大家好呀!这里是码农后端。今天来聊一聊Linux下的yum源及其配置相关的内容。简单来说,yum源就相当于一个管理软件的工具,可以想象成一个很大的仓库,里面存放着各种我们所需要的软件包及其依赖。 一、Linux下软件包…...
Node.js全栈指南:认识MIME和HTTP
MIME,全称 “多用途互联网邮件扩展类型”。 这名称相当学术,用人话来说就是: 我们浏览一个网页的时候,之所以能看到 html 文件展示成网页,图片可以正常显示,css 样式能正常影响网页效果,js 脚…...
基于weixin小程序智慧物业系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,员工管理,房屋管理,缴费管理,车位管理,报修管理 工作人员账号功能包括:系统首页,维…...
成功解决TypeError: __call__() got an unexpected keyword argument ‘first_int‘
成功解决TypeError: __call__() got an unexpected keyword argument first_int 目录 解决问题 解决思路 解决方法 T1、直接调用原始函数 T2、检查装饰器实现 T3、使用不同的调用方式 解决问题 result = multiply(**arguments) File "D:\ProgramData\Anaconda3\Li…...
vue3用自定义指令实现按钮权限
1,编写permission.ts文件 在src/utils/permission.ts import type { Directive } from "vue"; export const permission:Directive{// 在绑定元素的父组件被挂载后调用mounted(el,binding){// el:指令所绑定的元素,可以用来直接操…...
Nuxt3:当前页面滚动到指定位置
在Nuxt 3中,如果你想让当前页面跳转到指定位置,可以使用scrollIntoView方法。你需要给目标位置的元素添加一个ref引用,然后通过程序调用该ref来执行滚动。 以下是一个简单的例子: <template><div><!-- 其他内容 …...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
