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()# 结果
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦
我要唱歌,哈哈哈
我要唱歌,哈哈哈我在跳舞,啦啦啦我在跳舞,啦啦啦
我要唱歌,哈哈哈
我在跳舞,啦啦啦我要唱歌,哈哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362782.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全局mixins

一、文章由来 在开发过程中发现在钩子函数位置直接使用dicts就能直接绑定数据了&#xff0c;由此溯源发现了自己的盲区 二、局部使用 // myMixin.js文件 var myMixin {created: function () {this.hello()},methods: {hello: function () {console.log(hello from mixin!)…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件&#xff0c;主要通过钓鱼邮件打开突破口&#xff0c;收集各种信息再回传给攻击者。近期&#xff0c;研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件&#xff0c;最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

JVM专题十三:总结与整理(持续更新)

图解JVM JVM与Java体系结构 JVM垃圾回收算法 JVM垃圾回收器 图解JVM主要是放了前面12个章节的我们给大家画的图&#xff0c;做了整体的汇总&#xff0c;大家可以根据图区回忆我们所说的内容&#xff0c;查缺补漏。 实战经验 1、项目中数据量多少&#xff0c;QPS与TPS最高多少…

展开说说:Android列表之RecyclerView

RecyclerView 它是从Android5.0出现的全新列表组件&#xff0c;更加强大和灵活。用于显示列表形式 (list) 或者网格形式 (grid) 的数据&#xff0c;替代ListView和GridView成为Android主流的列表组件。可以说Android客户端只要有表格的地方就有RecyclerView。 RecyclerView 内…

技术速递|Visual Studio Code 的 .NET MAUI 扩展现已正式发布

作者&#xff1a;Maddy Montaquila 排版&#xff1a;Alan Wang 今天&#xff0c;我们非常高兴地宣布 .NET MAUI VS Code 扩展插件结束了预览阶段&#xff0c;并将包含一些期待已久的新功能 - 包括 XAML IntelliSense 和 Hot Reload&#xff01; 什么是 .NET MAUI 扩展插件&…

鸿蒙开发Ability Kit(程序框架服务):【ServiceAbility切换】 组件切换

ServiceAbility切换 FA模型中的ServiceAbility对应Stage模型中的ServiceExtensionAbility。Stage模型下的ServiceExtensionAbility为系统API&#xff0c;只有系统应用才可以创建。因此&#xff0c;FA模型的ServiceAbility的切换&#xff0c;对于系统应用和三方应用策略有所不同…

4A的「A」会变成AI的「A」吗?

戛纳国际创意节上&#xff0c;广告集团WPP的全球CEO Mark Read 和英国CEO Karen Blackett 解释了WPP如何应对AIGC所带来的「威胁」。同时&#xff0c;Mark Read 与Elon Musk对话&#xff0c;讨论「技术创新的变革力量&#xff0c;人工智能如何重塑创造力、商业和社会&#xff0…

Duix - 硅基数字人SDK

简介 Introduction DUIX(Dialogue User Interface System)是硅基智能打造的AI数字人智能交互平台。通过将数字人交互能力开源,开发者可自行接入多方大模型、语音识别(ASR)、语音合成(TTS)能力,实现数字人实时交互,并在Android和iOS多终端一键部署,让每个开发者可轻松…

基于长短时记忆网络LSTM的TE过程故障诊断(MATLAB R2021B)

实验所用 TE 仿真过程的数据集是网上公开的数据集&#xff0c;该数据集中的训练集和测试集分别包含 20 种故障工况和一种正常工况数据&#xff0c;其中所采集的每个样本信号包含 41 个测量变量和 11 个控制变量&#xff0c;所以每个时刻采集到的样本有 52 个观测变量。 TE 仿真…

IO流

文件 什么是文件 文件流 常用的文件操作 创建文件对象相关构造器和方法 public class FileCreate {public static void main(String[] args) {}//方式 1 new File(String pathname)//根据路径构建一个File对象Testpublic void create01() {String filePath "e:\\news1.…

TMGM:ASIC撤销禁令,TMGM强化合规、重启差价合约服务

TMGM作为差价合约&#xff08;CFDs&#xff09;与保证金外汇交易领域的领航者&#xff0c;安全、合规、高效被奉为我集团的终身使命。澳大利亚证券和投资委员会&#xff08;ASIC&#xff09;已正式撤销了早前针对TMGM差价合约业务实施的临时止损令。这一误会的解除&#xff0c;…

使用North自部署图床服务

图床 图床可以把图片转为链接&#xff0c;从而方便我们书写、分享博客&#xff0c;目前图床主要分为以下几类: 利用 Git 仓库存储对象存储&#xff08;OSS、COS、七牛云等&#xff09;免费公共图床&#xff08;SM.MS、聚合图床、ImgTP、Postimage等&#xff09; 但上述图床都…

Zabbix 监控系统部署

Zabbix 监控系统部署 Zabbix是一个企业级开源分布式监控解决方案&#xff0c;可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的运行状况和完整性。 Zabbix 使用灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于电子邮件的警报。这允许…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(转换、拆分、分割、连接、替换、查找、“Like“)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

活动|华院计算受邀参加2024全球人工智能技术大会(GAITC),探讨法律大模型如何赋能社会治理

6月22至23日&#xff0c;备受瞩目的2024全球人工智能技术大会&#xff08;GAITC&#xff09;在杭州市余杭区未来科技城隆重举行。本届大会以“交叉、融合、相生、共赢”为主题&#xff0c;集“会、展、赛”为一体&#xff0c;聚“产、学、研”于一堂。值得一提的是&#xff0c;…

C#——命名空间详情

命名空间 在 C# 中&#xff0c;可以将命名空间看作是一个范围&#xff0c;用来标注命名空间中成员的归属&#xff0c;一个命名空间中类与另一个命名空间中同名的类互不冲突&#xff0c;但在同一个命名空间中类的名称必须是唯一的。 定义命名空间 定义命名空间需要使用 namesp…

【设计模式】行为型-策略模式

策略模式&#xff0c;如春风吹过&#xff0c;随心所欲&#xff0c;变幻无穷&#xff0c;每一丝风都是一种选择。 文章目录 一、订单处理二、策略模式三、策略模式的核心组成四、运用策略模式五、策略模式的应用场景六、小结推荐阅读 一、订单处理 场景假设&#xff1a;有一个…

容器技术-docker5 (1)

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置…

vscode刷LeetCode算法题环境配置

首先&#xff0c;下载nodejs 在vscode中安装LeetCode插件 安装好进行配置 选择leetcode-cn 填上刚才下载node.exe的路径 完成之后重启一下vscode 重启之后登陆LeetCode 完成之后就可以看到题目了 点击 code now 就可以开始刷题了

ueditor解决无法抓取远程背景图片问题的方法(php)

背景 laravel后台经常有用到编辑器的地方&#xff0c;Dcat使用的一般都是UEditor编辑器。最近项目经理在秀米排版以后&#xff0c;将内容复制到UEditor编辑器保存后发现&#xff0c; 在网站页面中发现图片竟然展示失败。经过浏览器控制台发现&#xff0c;图片的域名还是秀米的…