1、闭包
简单闭包
def outerto(look):
def innerin(con):
print(f"-{look}-{con}-{con}")
return innerin
ou=outerto("wo")
ou("ou")
ou("oi")
修改外部函数变量的值
def outerto(num1):
def innerin(num2):
nonlocal num1 # 使用nonlocal关键字修饰外部函数的变量才可修改内部函数
num1 +=num2
print(num1)
return innerin
ou=outerto(10)
ou(29)
2、装饰器
装饰器是一种闭包,功能:在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。
写法1
def outer(func):
def inner(:
print("睡觉") # 定义一个闭包函数,在闭包函数内部:
func()
print("起床") # 执行目标函数,完成功能的添加
return inner
def sleep():
import random
import time
print("睡眠")
time.sleep(random.randint(1,5))
fn = outer(sleep)
fn()
写法2:
def outer(func):
def inner():
print("睡觉")
func()
print("起床")
return inner
@outer # 使用@outer 定义在目标函数sleep之上
def sleep():
import random
import time
print("睡眠") time.sleep(random.randint(1,5))
sleep()
3、设计模式
单例模式
class Test:
pass
t1=Test()
t2=Test()
print(t1)
print(t2)
工厂模式
class Person:
pass
class Worker(Person):
pass
class Student(Person):
pass
class Teacher(Person):
pass
class Factory:
def get_person(self,p_type):
if p_type -'Worker':
return Worker()
elif p_type ='Student':
return Student()
else:
return Teacher()
factory= Factory()
worker =factory.get_person('Worker')
stu= factory.get_person('Student')
teacher =factory.get_person('teacher')
4、多线程
import thearding
thread_obj=threading.Thread([group[,target[,name[,args[,kwards]]]]])
group:未来功能预留参数
target:执行目标任务名
args:以元组的方式传参给执行任务
kwards:以字典的方式传参给执行任务
name:线程名
thread_obj.start() # 启动线程
5、服务端开发
Socket服务端编程
主要分为如下几个步骤:
(1)创建socket对象
import socket
socket_server=socket.socket O
(2)绑定socket server指定IP和地址
socket_server.bind (host, port)
(3)服务端开始监听端口
socker_server.listen(backlog)
backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值(4)接收客户端连接,获得连接对象
conn, address = socket_server.accept()
print(f“与客户端连接,来自:{address}”)
# accept方法是阳塞方法,如果没有连接,会卡再当前这一行不向下执行代码,返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素
import socket
socketserver=socket.socket()
socketserver.bind(("127.0.0.1",6666))
socketserver.listen(1)
conn,address=socketserver.accept()
print(f"已连接客户端:{address}")
data:str=conn.recv(1024).decode("UTF-8")
print(f"客户端:{data}")
con=input("服务器端:").encode("UTF-8")
conn.send(con)
conn.close()
socketserver.close()
6、客户端开发
Socket客户端编程
主要分为如下几个步骤:
(1)创建socket对象
import socket
socket_client =socket.socket( )
(2)连接到服务端
socket_client.connect(C"localhost", 8888))
(3)发送消息
while True: # 通过无限循环来确保持续的发送消息
send_msg=input("请输入")
if send_msg = 'exit':
break # 标记退出循环
socket_client.send(send_msg.encode ("UTF-8"))
import socket
socketclient = socket.socket()
socketclient.connect(("localhost", 6666))
while True:
con= input("客户端:")
if con == 'exit':
break
socketclient.send(con.encode("UTF-8"))
recvdata = socketclient.recv(1024)
print(f"服务器端:{recvdata.decode('UTF-8')}")
socketclient.close()
7、正则表达式
就是使用字符串定义规则,并通过规则去验证字符串是否匹配
(1)使用re模块中三个基础方法
re.match(匹配规则,被匹配字符串):从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),不成功返回空
search(匹配规则,被匹配字符串):搜索整个字符串,找出匹配的,从前向后,找到第一个后停止,整个字符串找不到返回None
findall(匹配规则,被匹配字符串):匹配整个字符串,找出全部匹配项,找不到返回空list:[]
(2)元字符匹配
单字符匹配
. :匹配任意1个字符(除了\n),\.匹配点本身
[] : 匹配[]中列举的字符
\d : 匹配数字,即0-9
\D : 匹配非数字
\s : 匹配空白,即空格、tab键
\S : 匹配非空白
\w : 匹配单词字符,即a-z、A-Z、0-9、_
\W : 匹配非单词字
数量匹配:
* : 匹配前一个规则的字符出现0至无数次
+ :匹配前一个规则的字符出现1至无数次
? : 匹配前一个规则的字符出现0次或1次
{m} : 匹配前一个规则的字符出现m次
{m,} : 匹配前一个规则的字符出现最少m次
{m,n} : 匹配前一个规则的字符出现m到n次
边界匹配
^ : 匹配字符串开头
$ : 匹配字符串结尾
\b : 匹配一个单次的边界
\B : 匹配非单次边界
分组匹配
| :匹配左右任意一个表达式
() :将括号中字符作为一个分组
8、递归
方法(函数)调用自己的一种特殊编程写法
def func():
if ... :
func()
return ...