1.闭包:
- 闭包的使用场景:
当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作,比如: 每次在这个变量的基础上和其它数字进行求和计算。
- 闭包的定义:
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
- 闭包的作用:
闭包可以保存函数内的变量,不会随着函数调用完而销毁。
- 闭包的构成条件:
①在函数嵌套(函数里面再定义函数)的前提下。
②内部函数使用了外部函数的变量(还包括外部函数的参数)。
③外部函数返回了内部函数。
- 闭包流程图:
2.装饰器:
- 装饰器的作用:
在不改变原有函数的源代码的情况下,给函数增加新的功能。
- 装饰器的功能特点:
①不修改已有函数的源代码。
②给已有函数增加额外的功能。
- 装饰器的使用步骤:
①定义一个装饰器(装饰器的本质是闭包)。
②使用装饰器装饰函数。
def check(fn):
def inner():
pint("请先登录")
fn()
return inner
def comment():
print("发表评论")
comment = check(comment)
comment()
- 装饰器的流程图:

-
通用装饰器:
import traceback
def outer(fn):
def inner(*args, **kwargs):
try:
fn(*args, **kwargs)
except Exception as e:
with open("error.log", "a", encoding="utf-8") as file:
file.write(traceback.format_exc())
return inner@outer
def print_list(my_list):
for i in my_list:
print(i)@outer
def get_sum(a, b):
print(a + b)print_list([1, 45, 76])
get_sum(10, b=20) -
带有参数的装饰器:
import traceback
def foo(path="error.log"):
def outer(fn):
print(path)
def inner(*args, **kwargs):
try:
fn(*args, **kwargs)
except Exception as e:
with open(path, "a", encoding="utf-8") as file:
file.write(traceback.format_exc())
return inner
return outer@foo()
def print_name():
print(name)print_name()
3.IP地址:
- **作用 :**标识网络中唯一的一台设备。
- **分类 :**IPv4和IPv6
- 查看IP地址的命令 :
Windows:ipconfig
Linux 和 Mac:ifconfig
- 检查电脑网络是否正常:
ping www.baidu.com
是否能连接互联网
ping 127.0.0.1
本地回环地址,检查网卡是否正常
4.端口和端口号:
- 作用 : 标识一台设备的一个网络应用程序。一台计算机最多有65536个端口,为了区分端口,每个端口都有编号:
0-65535
。 - 分类:
**知名端口号:**范围是0到1023,系统预留的一些端口号,不建议使用。
**动态端口号:**范围是1024到65535,建议使用。
- 注意:
(1) 一些动态端口号被一些常见程序占用了,自己写网络程序时,也不建议使用,比如:MySQL数据库 3306、redis数据库 6379、HDFS 9870等。
(2) 如果程序员开发的网络程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给应用程序使用。
(3) 当运行一个网络程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放。
5.TCP协议:
- TCP概念 :
TCP(Transmission Control Protocol) 是一种网络传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
- TCP 的特点 :
面向连接(三次握手)
可靠传输:保证数据不丢包\不乱序
- TCP 通信步骤:
创建连接
传输数据
关闭连接
6.socket:
- 简介 : socket (简称 套接字) 是进程之间通信一个工具,是操作系统提供的网络编程接口,屏蔽通过TCP/IP及端口进行网络数据传输的细节。
- **作用 :**进程之间的网络数据传输。
- **使用场景 :**网络相关的应用程序或者软件都使用到了 socket。
7.TCP网络应用程序开发流程:
- TCP网络程序开发流程:

- 1)客户端程序的开发流程:主动连接的
-
创建套接字对象
-
连接服务端
-
发送数据
-
接受数据
-
关闭连接
1.创建客户端的套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2.通过客户端套接字连接服务器程序
client_socket.connect(("127.0.0.1", 8080))
3.给服务器发送消息
send_msg = input("请输入给客户端发送的消息")
client_socket.send(send_msg.encode())4.接收服务端回应的消息
recv_msg = client_socket.recv(1024)
5.关闭客户端套接字
client_socket.close()
- 2)服务端程序的开发流程:等待连接的
-
创建监听套接字对象
-
绑定端口
-
开始监听
-
等待连接
-
发送数据
-
接受数据
-
关闭连接
1.创建一个服务端监听的套接字
socket.AF_INET:表示使用IPv4的地址
socket.SOCK_STREAM:表示使用TCP协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2.绑定服务端程序的IP和端口号
server_socket.bind(('127.0.0.1', 8080))
3.设置监听
127表示服务端监听套接字同一时间最多支持127个客户端发起连接请求
server_socket.listen(127)
4.等待客户端程序连接服务端程序
accept方法会默认阻塞,直到客户端进行连接
server_client:专门用于和客户端进行通信的套接字
ip_port:客户端的ip和端口号
server_client, ip_port = server_socket.accept()
5.服务器接收来自客户端的消息
1024表示每次最多接收1024bytes
当客户端没有给服务器发送消息时,recv方法会阻塞等待,直到客户端发送了消息
recv_msg = server_client.recv(1024)
print("接收到客户端的消息", recv_msg.decode())6.服务器给客户端回应一个消息
send_msg = input("请输入响应的消息")
server_client.send(send_msg.encode())7.关闭服务端套接字
server_client.close()
server_socket.close()
8.TCP文件传输:
-
客户端:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8080))
file = open("小电影.mp4", "rb")
while True:
data = file.read(1024)
client_socket.send(data)
if len(data) == 0:
breakfile.close()
client_socket.close() -
服务端:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8080))
server_socket.listen(128)
server_client, ip_port = server_socket.accept()
file = open("./dest/小电影.mp4", "wb")
while True:
data = server_client.recv(1024)
file.write(data)
if len(data) == 0:
break
file.close()
server_client.close()
server_socket.close()
9.recv 方法解阻塞的 3 种情况:
1)对端 发送过来了数据
socket套接字对象.send(发送数据)
2)对端 socket 套接字关闭了输出流
# socket.SHUT_WR
# socket.SHUT_RD
socket套接字对象.shutdown(socket.SHUT_WR)
3)对端 socket 套接字被关闭
scoket套接字对象.close()
10.本机回环地址、局域网地址、外网地址

- 本机回环地址:127.0.0.1或localhost域名,如果运行网络程序时,使用的是本地回环地址,那么该网络程序只有在本机才能进行访问。
- 局域网地址:局域网中的每台机器,都会有一个局域网的地址,比如:一个班级、一个公司,如果运行网络程序时,使用的是局域网地址,那么该网络程序可以被同一个局域网的其他机器进行访问。
- 外网地址:也叫公网地址,如果运行网络程序时,使用的是外网地址,那么只要有网,就能访问该网络程序。