python基础day08
1.闭包:
- 闭包的使用场景:
当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作,比如: 每次在这个变量的基础上和其它数字进行求和计算。
- 闭包的定义:
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
- 闭包的作用:
闭包可以保存函数内的变量,不会随着函数调用完而销毁。
- 闭包的构成条件:
①在函数嵌套(函数里面再定义函数)的前提下。
②内部函数使用了外部函数的变量(还包括外部函数的参数)。
③外部函数返回了内部函数。
- 闭包流程图:
2.装饰器:
- 装饰器的作用:
在不改变原有函数的源代码的情况下,给函数增加新的功能。
- 装饰器的功能特点:
①不修改已有函数的源代码。
②给已有函数增加额外的功能。
- 装饰器的使用步骤:
①定义一个装饰器(装饰器的本质是闭包)。
②使用装饰器装饰函数。
def check(fn):def inner():pint("请先登录")fn()return innerdef comment():print("发表评论")comment = check(comment)
comment()
- 装饰器的流程图:
- 通用装饰器:
import tracebackdef 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 tracebackdef 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 innerreturn 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. 创建套接字对象
2. 连接服务端
3. 发送数据
4. 接受数据
5. 关闭连接
# 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. 创建监听套接字对象
2. 绑定端口
3. 开始监听
4. 等待连接
5. 发送数据
6. 接受数据
7. 关闭连接
# 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 socketclient_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 socketserver_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域名,如果运行网络程序时,使用的是本地回环地址,那么该网络程序只有在本机才能进行访问。
- 局域网地址:局域网中的每台机器,都会有一个局域网的地址,比如:一个班级、一个公司,如果运行网络程序时,使用的是局域网地址,那么该网络程序可以被同一个局域网的其他机器进行访问。
- 外网地址:也叫公网地址,如果运行网络程序时,使用的是外网地址,那么只要有网,就能访问该网络程序。