文章目录
- 一、闭包
- 1.什么是闭包
- 2.优缺点
- 3.nonlocal关键字
- 二、装饰器
- 1.什么是装饰器
- 2.举例
- 3.传统方式
- 4.装饰器方式
- 5.语法糖写法
- 三、多线程
- 1.线程参数
- 2.多线程编程
- 四、网络编程
- 1.Socket服务端编程
- 2.Socket客户端编程
「章节总览」
【2024速通python之python基础 https://blog.csdn.net/weixin_45404884/article/details/138578955】
【2024速通python之python进阶 https://blog.csdn.net/weixin_45404884/article/details/138663338】
【2024速通python之python高阶 https://blog.csdn.net/weixin_45404884/article/details/138810133】
【2024速通python之python面向对象https://blog.csdn.net/weixin_45404884/article/details/139473507】
【2024速通python之python高阶技巧https://blog.csdn.net/weixin_45404884/article/details/139521584】
一、闭包
1.什么是闭包
- 定义双层嵌套函数, 内层函数可以访问外层函数的变量
- 将内存函数作为外层函数的返回,此内层函数就是闭包函数
这里的inner就是闭包函数,如果需要修改外层函数的outerNum变量,则需要用nonlocal关键字来声明
def outer(outerNum):def inner(innerNum):nonlocal outerNumouterNum = outerNum + 1print(f"Inner function num is {innerNum} and outer function num is {outerNum}")return innerout = outer(100)
out(200)
2.优缺点
-
优点,使用闭包可以让我们得到:
无需定义全局变量即可实现通过函数,持续的访问、修改某个值
闭包使用的变量的所用于在函数内,难以被错误的调用修改 -
缺点:
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存
3.nonlocal关键字
在闭包函数(内部函数中)想要修改外部函数的变量值,需要用nonlocal声明这个外部变量
二、装饰器
1.什么是装饰器
装饰器其实也是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。
2.举例
将下面的睡觉函数,在调用sleep前后输出,“我打算睡觉了”、“我起床了”
def sleep():time.sleep(2)print("睡眠中....")sleep()
3.传统方式
def sleep():time.sleep(2)print("睡眠中....")print("我打算睡觉了")
sleep()
print("我起床了")
4.装饰器方式
def sleep():time.sleep(2)print("睡眠中....")def outer(func):def inner():print("我打算睡觉了")func()print("我起床了")return innerfn = outer(sleep)
fn()
5.语法糖写法
简化了调用,增加@outer注解在调用方法上,相当于java中为某个方法增加切面
def outer(func):def inner():print("我打算睡觉了")func()print("我起床了")return inner@outer
def sleep():time.sleep(2)print("睡眠中....")sleep()
三、多线程
1.线程参数
Python的多线程可以通过threading模块来实现。
- target:执行的目标任务名称
- args:以元组的方式给执行任务传参
- name:线程名
- daemon:是否设置为守护线程
- kwargs:以字典方式传参
2.多线程编程
def sing(msg):print(f"我在唱歌。。。{msg}")def dance(msg):print(f"我在跳舞。。。{msg}")import threadingthread_obj1 = threading.Thread(target=sing, args=('开心!',), name='sing')thread_obj2 = threading.Thread(target=dance, args=('快乐!',), name='dance')thread_obj1.start()
thread_obj2.start()
四、网络编程
1.Socket服务端编程
主要分为如下几个步骤:
- 创建socket对象
- 绑定socket_server到指定IP和地址
- 服务端开始监听端口
- 接收客户端连接,获得连接对象
- 客户端连接后,通过recv方法,接收客户端发送的消息
- 通过conn(客户端当次连接对象),调用send方法可以回复消息
- conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接
代码示例:
import socketsocket_server = socket.socket()
socket_server.bind(('127.0.0.1', 8888))
socket_server.listen()conn, addr = socket_server.accept()
print('Connected by', addr)
while True:data = conn.recv(1024).decode('utf-8')if data == 'exit':breakprint(f"接收到的客户端数据: {data}")conn.send("你好,我是服务端".encode('utf-8'))conn.close()
socket_server.close()
2.Socket客户端编程
主要分为如下几个步骤:
- 创建socket对象
- 连接到服务端
- 发送消息
- 接收返回消息
- 关闭链接
代码示例:
import socketsocket_client = socket.socket()
socket_client.connect(('127.0.0.1', 8888))while True:send_msg = input("输入要发送的消息:")if send_msg == "exit":breaksocket_client.send(send_msg.encode("utf-8"))recv_msg = socket_client.recv(1024)print("服务端回复的消息:", recv_msg.decode("utf-8"))socket_client.close()