闭包
定义
- 定义双层嵌套函数,内层函数可以访问外层函数的变量
- 将内层函数作为外层函数的返回,此内层函数就是闭包函数
- 代码示例
def out_func1(label):
def in_func1(msg):
print(f'{label}{msg}{label}')
return in_func1
out = out_func1("边框")
out("hello")
nonlocal关键字作用
def outer_func(out_num):
def in_func(in_num):
nonlocal out_num
out_num += in_num
print(out_num)
return in_func
优缺点
优点
- 无需定义全局变量即可实现通过此函数,持续的访问、修改某个值
- 闭包使用的变量的作用域在函数内部,难以被错误的调用修改
缺点
- 由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放
装饰器
- 装饰器也是一种闭包
- 功能:在不破坏目标函数原有代码和功能的前提下,为目标函数增加新功能
装饰器闭包写法
def outer1(func):
def inner():
print("start")
func()
print("end")
return inner
@outer1
def sleep1():
import random
import time
print("sleep...")
time.sleep(random.randint(1, 5))
sleep1()
设计模式
单例模式
- 一个类无论获取多少次类对象,都只提供一个具体的实例
- 好处:节省创建类对象的开销和内存开销
- 使用场景:当一个类只有一个实例,而客户可以从一个众所周知的访问节点访问它
- 代码示例
class StrTools:
pass
str_tools = StrTools()
from 单例模式 import str_tools
s1 = str_tools
s2 = str_tools
print(s1)
print(s2)
工厂模式
优点
- 大批量创建对象的时候有统一的入口,易于代码维护
- 当发生修改,进修改工厂类的创建方法即可
- 符合现实世界的模式,即由工厂来制作产品
代码示例
class Person:
pass
class Worker(Person):
pass
class Sturent(Person):
pass
class Teacher(Person):
pass
class Factory:
def get_person(self, p_type):
if p_type == 'w':
return Worker()
elif p_type == 's':
return Sturent()
else:
return Teacher()
factor = Factory()
worler = factor.get_person('w')
student = factor.get_person('s')
teacher = factor.get_person('t')
多线程
基本概念
- 进程:程序在操作系统内运行,即成为一个运行进程
- 线程:进程内部可以有多个线程,程序的运行本质上是由进程内部的线程在实际工作的
- 并行执行
- 多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
- 一个进程内的多个线程同时在运行,称之为:多线程并行执行
threading模块
- Python的多线程可以通过threading模块来实现
- 语法
import threading
thread_obj = threading.Thread([group[, target[, name[, args[, kwargs]]]]])
group:预留参数,暂未使用
target:执行的目标任务名
args:以元组的方式给执行任务传参
kwargs:以字典的方式给执行任务传参
name:线程名,一般不设置
thread_obj.start()
import time
import threading
def sing(msg):
while True:
print(f"{msg}")
time.sleep(1)
def dance(msg):
while True:
print(f'{msg}')
time.sleep(1)
if __name__ == '__main__':
sing_thread_obj = threading.Thread(target=sing, args=("sing sing sing",))
dance_thread_obj = threading.Thread(target=dance, kwargs={"msg": "dance dance dance"})
sing_thread_obj.start()
dance_thread_obj.start()
网络编程
服务端开发
socket
- socket是进程之间的一个通信工具,socket负责进程之间的网络数据传入
- socket服务端:等到其它进程的连接、可接受发来的消息,可以回复消息
- socket客户端:主动连接服务端、可以发送消息,可以接收消息
socket服务端编程
- 步骤
- 创建socket对象
- 绑定socket_server到指定IP和地址
- 服务端开始监听端口
- 接收客户端连接,获取连接对象
- 客户端连接后,通过recv方法,接收客户端发送的消息
- 通过conn,调用send方法可以回复消息
- conn和socket_server对象调用close方法关闭连接
- 代码示例
import socket
socket_servre = socket.socket()
socket_servre.bind(("127.0.0.1", 9000))
socket_servre.listen(10)
conn, addr = socket_servre.accept()
print(f'Accept,address:{addr}')
while True:
data = conn.recv(1024).decode("UTF-8")
if data == 'exit':
break
print(f'接收到发送的数据:{data}')
conn.send(input('输入要回复给客户端的信息:').encode("UTF-8"))
conn.close()
socket_servre.close()
客户端开发
- 步骤
- 创建socket对象
- 连接到服务端
- 发送消息
- 接收返回消息
- 关闭连接
- 代码示例
import socket
socket_client = socket.socket()
socket_client.connect(('127.0.0.1', 9000))
while True:
send_msg = input("请输入要发送的消息:")
if send_msg == 'exit':
break
socket_client.send(send_msg.encode('UTF-8'))
recv_data = socket_client.recv(1024).decode('UTF-8')
print(f'服务端回复的消息:{recv_data}')
socket_client.close()
正则表达式
正则的三个基础方法
- Python正则表达式,使用re模块,并基于
match、search、findall
来做正则匹配
match
- 语法:
re.match(匹配规则,被匹配的字符串)
- 从被匹配字符串开头进行匹配,匹配成功返回匹配对象,匹配不成功返回空
- 特点:从头开始匹配
- 代码示例
import re
s = "python itheima python itheima python itheima"
result = re.match('python', s)
print(result)
print(result.span())
print(result.group())
s1 = "1python itheima python itheima python itheima"
result = re.match('python', s1)
print(result)
search
- 语法:
search(匹配规则, 被匹配字符串)
- 功能:搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
- 特点:只匹配一个
- 代码示例
import re
s1 = "1python itheima python itheima python itheima"
result = re.search('python', s1)
print(result)
print(result.span())
print(result.group())
findAll
- 语法:
findall(匹配规则, 被匹配字符串)
- 功能:匹配整个字符串,找出全部匹配项,找不到返回空list
- 代码示例
import re
s1 = "1python itheima python itheima python itheima"
result = re.findall('python', s1)
print(result)
元字符匹配
单字符匹配

数量匹配

边界匹配

分组匹配
