python基础day08

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. 创建套接字对象

  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 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:
    break

    file.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域名,如果运行网络程序时,使用的是本地回环地址,那么该网络程序只有在本机才能进行访问。
  • 局域网地址:局域网中的每台机器,都会有一个局域网的地址,比如:一个班级、一个公司,如果运行网络程序时,使用的是局域网地址,那么该网络程序可以被同一个局域网的其他机器进行访问。
  • 外网地址:也叫公网地址,如果运行网络程序时,使用的是外网地址,那么只要有网,就能访问该网络程序。
相关推荐
weixin_41881387几秒前
Python-可视化学习笔记
笔记·python·学习
小白学大数据1 分钟前
R语言爬虫实战:如何爬取分页链接并批量保存
开发语言·爬虫·信息可视化·r语言
争不过朝夕,又念着往昔4 分钟前
Go语言反射机制详解
开发语言·后端·golang
Azxcc015 分钟前
C++异步编程入门
开发语言·c++
Danceful_YJ16 分钟前
4.权重衰减(weight decay)
python·深度学习·机器学习
Biaobiaone20 分钟前
Java中的生产消费模型解析
java·开发语言
我命由我1234535 分钟前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js
特立独行的猫a1 小时前
11款常用C++在线编译与运行平台推荐与对比
java·开发语言·c++
Zonda要好好学习1 小时前
Python入门Day5
python
VBA63372 小时前
VBA之Word应用第三章第十一节:Document对象的事件
开发语言