# 闭包
# 定义
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部含糊,我们将这个使用外部函数变量的内部函数称之为闭包
![image-20230429131934545]()
# 修改外部函数变量的值
| def outer(num1): |
| def inner(num2): |
| nonlocal num1 |
| num1 += num2 |
| print(num1) |
| return inner |
| fn = outer(10) |
| fn(10) |
# 装饰器
# 定义
装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有代码和功能前提下,为目标函数增加新功能
# 代码
| def outer(func): |
| def inner(): |
| print("我要睡觉了") |
| func() |
| print("我起床了") |
| return inner |
| @outer |
| def sleep(): |
| import random |
| import time |
| print("睡眠中...") |
| time.sleep(random.randint(1, 5)) |
| sleep() |
# 设计模式
# 定义
- 设计模式是一种编程的套路,可以极大的方便我们程序的开发
- 常见设计模式:单例、工厂模式,建造者、责任链、备忘录、解释器、访问者、观察者、中介、模板、代理模式
# 单例模式
# 单例模式介绍
- 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在
- 定义:保证一个类只有一个实例对象,并提供一个访问它的全局访问点
- 适用场景:当一个类只能有一个实例,而客户可以从一个众所周知的范围跟点访问它
# 实现
# 在一个文件中定义代码
| class StrTools: |
| pass |
| str_tool = StrTools() |
# 在另一文件中导入对象
| from test import str_tool |
| s1 = str_tool |
| s2 = str_tool |
| print(s1) |
| print(s2) |
| |
# 工厂模式
# 工厂模式介绍
- 适用工厂类的 get_person () 方法取创建类对象
- 大批量创建对象的时候有统一入口,易于代码维护
- 当发生修改,仅修改工厂类的创建方法即可
- 符合现实世界模式,即由工厂来制作产品(对象)
# 实现
| class Person: |
| pass |
| class Worker(Person): |
| pass |
| class Student(Person): |
| pass |
| class Teacher(Person): |
| pass |
| class 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') |
| student = pf.get_person('s') |
| teacher = pf.get_person('t') |
# 多线程
# 进程、线程
- 进程:就是一个程序,运行在系统之上,那么称这个程序,并分配进程 ID 方便系统管理
- 线程:线程是归属于进程的,一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位
- 进程之间是内存隔离的,即不同的进程拥有各自的内存空间
- 线程之间是内存共享的,线程是属于进程的,一个进程内的多个线程之间是共享这个进程所拥有的内存空间
![image-20230429144058858]()
# 并行执行
- 并行执行的意思指的是同一实践做不同的工作
- 进程之间就是并行执行,操作系统可以同时运行好多程序,这些程序都是在并行执行
# 多线程编程
| import time |
| import threading |
| def sing(msg): |
| while True: |
| print(msg) |
| time.sleep(1) |
| def dance(): |
| while True: |
| print(msg) |
| time.sleep(1) |
| if __name__ == '__main__': |
| sing_thread = threading.Thread(target=sing, args=("sing")) |
| dance_thread = threading.Thread(target=dance, kwargs={"msg": "dance"}) |
| sing_thread.satrt() |
| dance_thread.start() |
# 网络编程
# 服务端开发
# Socket
- Socket(套接字)是进程之间通信的一个工具,进程之间想要通信需要适用 socket
- Socket 服务端:等待其它进程的连接、可接受发来的 i 西澳西,可以恢复消息
- Socket 客户端:主动连接服务器,可以发送消息,可以接受回复
# 实现步骤
- 创建 socket 对象
- 绑定 socket_server 到指定 IP 和地址
- 服务端开始监听端口
- 接受客户端连接,获取连接对象
- 客户端连接后,通过 revc 方法,接受客户端发送的消息
- 通过 conn(客户端当次连接对象),调用 send 方法可以回复消息
- conn(客户端当次连接对象)和 socket_server 对象调用 close () 方法,关闭连接
# 客户端开发
# 实现步骤
- 创建 socket 对象
- 连接到服务器
- 发送消息
- 接受返回消息
- 关闭链接
# 正则表达式
# 定义
正则表达式,又称为规则表达式(Regular Expression),是使用单个字符串来描述,匹配某个句法规则的字符串,常被用来检索、替换哪些符合某个模式的文本
# re 模块三个方法
re.match
,从头开始匹配,匹配第一个命中项
re.search
,全局匹配,匹配第一个命中项
re.findall
,全局匹配,匹配全部命中项
# 元字符匹配
# 单字符匹配
字符 |
功能 |
. |
匹配任意 1 个字符 |
[] |
匹配 [] 中列举的字符 |
\d |
匹配数字,即 0-9 |
\D |
匹配非数字 |
\s |
匹配空白,即空格,tab 键 |
\S |
匹配非空白 |
\w |
匹配单词字符,a-z、A-Z、0-9、_ |
\W |
匹配非单词字符 |
# 数量匹配
字符 |
功能 |
* |
匹配前一个规则的字符出现 0 至无数次 |
+ |
匹配后一个规则的字符出现 1 至无数次 |
? |
匹配前一个规则的字符出现 0 次或 1 次 |
|
匹配前一个规则的字符出现 m 次 |
|
匹配前一个规则的字符出现最少 m 次 |
|
匹配前一个规则的字符出现 m 到 n 次 |
# 边界匹配
字符 |
功能 |
^ |
匹配字符串开头 |
$ |
匹配字符串结尾 |
\b |
匹配一个单词的边界 |
\B |
匹配非单词的边界 |
# 分组匹配
字符 |
功能 |
| |
匹配左右任意一个表达式 |
() |
将括号中字符作为一个分组 |
# 递归
# 定义
- 递归在编程中是一种非常重要的算法
- 递归:即方法(函数)自己调用自己的一种特殊编程写法