【Django 网页Web开发】12. 实战项目:分页组件的封装 面向接口编程(05)(保姆级图文)

目录

    • 1. 对象的方式使用分页组件
    • 2. 项目结构
    • 3. 编写pagination.py
      • 3.1 pagination.py
      • 3.2 view.py
    • 4. bug修改之:url中搜索关键词q和page
      • 4.1 构造url的一个雏形
      • 4.2 修改我们的分页组件
      • 4.3 搜索小bug
    • 5. 应用分页组件,几行代码实现用户管理分页
      • 5.1 批量创建用户,增加用户数量
      • 5.2 修改user_list.html
      • 5.3 修改view.py
    • 总结


欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中

1. 对象的方式使用分页组件

自定义的分页组件,以后如果想要使用这个分页组件,你需要做如下几件事:

在视图函数中:
def pretty_list(request):

    # 1.根据自己的情况去筛选自己的数据
    queryset = models.PrettyNum.objects.all()

    # 2.实例化分页对象
    page_object = Pagination(request, queryset)

    context = {
        "queryset": page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()       # 生成页码
    }
    return render(request, 'pretty_list.html', context)

在HTML页面中

{% for obj in queryset %}
    {{obj.xx}}
{% endfor %}

<ul class="pagination">
    {{ page_string }}
</ul>

2. 项目结构

在app01下新建utils文件夹,新建pagination.py文件
现在


3. 编写pagination.py

  • 首先在def __init__获取得到request 和 request, queryset, page_size=10, page_param=“page”, plus=5 等必要数据
  • 给必要的数据标注self(成为对象的属性,便于后面对象方法的调用)
  • 创建html()函数用于返回生成的html页码相关的代码,可以调用前面定义的self属性
  • 上述的大部分操作就是把原来的代码cv到pagination.py,给必要的属性前加上self.
"""
自定义的分页组件,以后如果想要使用这个分页组件,你需要做如下几件事:

在视图函数中:

```python
    def pretty_list(request):

        # 1.根据自己的情况去筛选自己的数据
        queryset = models.PrettyNum.objects.all()

        # 2.实例化分页对象
        page_object = Pagination(request, queryset)

        context = {
            "queryset": page_object.page_queryset,  # 分完页的数据
            "page_string": page_object.html()       # 生成页码
        }
        return render(request, 'pretty_list.html', context)

在HTML页面中

    {% for obj in queryset %}
        {{obj.xx}}
    {% endfor %}

    <ul class="pagination">
        {{ page_string }}
    </ul>

3.1 pagination.py

import math

from django.shortcuts import render
from django.utils.safestring import mark_safe
class Pagination(object):

    def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):
        """
        :param request: 请求的对象
        :param queryset: 符合条件的数据(根据这个数据给他进行分页处理)
        :param page_size: 每页显示多少条数据
        :param page_param: 在URL中传递的获取分页的参数,例如:/etty/list/?page=12
        :param plus: 显示当前页的 前或后几页(页码)
        """

        page = request.GET.get(page_param, "1")
        #默认值是字符串的1是为了能够支持更多可能的数据类型,
        #可能以后我们封装数据接口的时候不一定是数据类型,
        #所以要把转化为int的工作放在下面的代码中

        if page.isdecimal():
            page = int(page)#转化为int类型
        else:
            page = 1

        self.page = page
        self.page_size = page_size # 每一页记录个数

        self.start = (page - 1) * page_size # 记录开始的区间
        self.end = page * page_size # 记录结束的区间

        self.page_queryset = queryset[self.start:self.end] #获取当前页码的数据

        #total_count = models.PrettyNum.objects.all().count()  # 统计所有数据记录数
        total_count = queryset.count()# 统计所有数据记录数

        # 页码

        self.plus = 5  # 当前页面 前后几页的数值
        self.total_page= math.ceil(total_count / 10)  # 总共页面数
	#绘制html页码的部分用方法html,调用self.属性
    def html(self):
        page_str_list = []
        if self.total_page < 2 * self.plus + 1:  # 页面过少,起始和结束页码改为1和总页面数
            start_page = 1
            end_page = self.total_page
        elif self.page < 1 + self.plus:  # 避免出现负数页码
            start_page = 1
            end_page = self.page + self.plus
        elif self.page + self.plus > self.total_page:  # 避免超过总页数
            start_page = self.page - self.plus
            end_page = self.total_page  # +1是因为range闭区间
        else:
            start_page = self.page - self.plus  # 当前页面
            end_page = self.page + self.plus
        # 首页
        page_str_list.append('<li><a href="?page={}">首页</a></li>'.format(1))

        # 上一页
        if self.page <= 1:
            prev = '<li><a href="?page={}">上一页</a></li>'.format(1)
        else:
            prev = '<li><a href="?page={}">上一页</a></li>'.format(self.page - 1)
        page_str_list.append(prev)

        # for i in range(1, 21):
        for i in range(start_page, end_page + 1):  # (306/10)=30.6->向上取整31 ->因为range右边闭区间还要+1
            if i == self.page:  # 如果是当前所在页面,添加激活样式
                ele = '<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)  # 生成多行页码li
            else:
                ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)  # 生成多行页码li
            page_str_list.append(ele)  # 添加到一个列表中

        # 下一页
        if self.page < self.total_page:  # 判断是否超过总页数
            next = '<li><a href="?page={}">下一页</a></li>'.format(self.page + 1)
        else:
            next = '<li><a href="?page={}">下一页</a></li>'.format(self.total_page)
        page_str_list.append(next)
        # 尾页
        page_str_list.append('<li><a href="?page={}">尾页</a></li>'.format(self.total_page))

        # 分页搜索框
        search_string = '''
             <form method="get">
            <div class="input-group" style="width:200px">
            <input type="text" name="page" class="form-control" value="" placeholder="页码">
            <span class="input-group-btn">
            <button class="btn btn-default" type="submit">跳转</button></span>
                    </div>
                </form>
            '''
        page_str_list.append(search_string)

        # page_string = "".join(page_str_list)  # 用""分隔符将列表页码的代码连接形成的字符串,需要加个安全信任才能变成html
        page_string = mark_safe("".join(page_str_list))  # 用""分隔符将列表页码的代码连接形成的字符串,需要加个安全信任才能变成html
        return page_string

3.2 view.py

以后其他页面使用分页功能也只需要page_object = Pagination(request, queryset)即可

def pretty_list(request):
    """ 靓号列表 """

    ## 随机创建若干数据,写好后f5刷新一下列表生效后注释掉这些代码
    # for i in range(300):
    #     models.PrettyNum.objects.create(mobile=random.randint(13000000000,19000000000),price=random.randint(1,1000),level=random.randint(1,4),status=random.randint(1,2))


    data_dict = {}
    search_data = request.GET.get("q")
    if search_data:  # 如果传来的参数非空就搜索,反之显示所有数据
        data_dict["mobile__contains"] = search_data  # 是否包含指定数据

    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")  # -level表示按照level降序排列显示

    page_object = Pagination(request, queryset)
    context = {
        "search_data": search_data,
        "queryset": page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()  # 页码
    }
    return render(request, 'pretty_list.html', context)

在这里插入图片描述


4. bug修改之:url中搜索关键词q和page

我们如何做到同时具有搜索功能和分页功能呢?
分页时候,保留原来的搜索条件

http://127.0.0.1:8000/pretty/list/?q=888
http://127.0.0.1:8000/pretty/list/?page=1

http://127.0.0.1:8000/pretty/list/?q=888&page=23

现在的关键在于如何在代码中实现?q=888&page=23

4.1 构造url的一个雏形

在原来的基础上增加了&page=11

def pretty_list(request):
    import copy
    query_dict=copy.deepcopy(request.GET)#http://127.0.0.1:8000/pretty/list/?q=1&csdn=2023
    print(query_dict.urlencode())#q=1&csdn=2023
    query_dict.mutable=True#不修改这个参数就会报错提示无法修改
    query_dict.setlist('page',[11])#q=1&csdn=2023&page=11 在原来的基础上增加了&page=11
    print(query_dict.urlencode())#讲url打印出来

在这里插入图片描述

4.2 修改我们的分页组件

pagination.py核心修改代码1 加入self.query_dict:

    def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):
        import copy
        query_dict = copy.deepcopy(request.GET)#复制query
        query_dict._mutable = True #设置query可以修改
        self.query_dict = query_dict

pagination.py核心修改代码2 把所有page换成参数列表self.query_dict,相当于原来只用page这个参数,现在是page和搜索关键词或者更多参数的一个参数列表:
以首页例子,就是把原来format的内容给到self中设置,然后再用self.query_dict.urlencode()替换原来format中的内容

        # 首页
        page_str_list.append('<li><a href="?page={}">首页</a></li>'.format(1))
        # 修改后的首页
        self.query_dict.setlist(self.page_param, [1])
        page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))        

pagination.py完整代码:

"""
自定义的分页组件,以后如果想要使用这个分页组件,你需要做如下几件事:

在视图函数中:
    def pretty_list(request):

        # 1.根据自己的情况去筛选自己的数据
        queryset = models.PrettyNum.objects.all()

        # 2.实例化分页对象
        page_object = Pagination(request, queryset)

        context = {
            "queryset": page_object.page_queryset,  # 分完页的数据
            "page_string": page_object.html()       # 生成页码
        }
        return render(request, 'pretty_list.html', context)

在HTML页面中

    {% for obj in queryset %}
        {{obj.xx}}
    {% endfor %}

    <ul class="pagination">
        {{ page_string }}
    </ul>

"""
import math

from django.shortcuts import render
from django.utils.safestring import mark_safe
class Pagination(object):

    def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):
        """
        :param request: 请求的对象
        :param queryset: 符合条件的数据(根据这个数据给他进行分页处理)
        :param page_size: 每页显示多少条数据
        :param page_param: 在URL中传递的获取分页的参数,例如:/etty/list/?page=12
        :param plus: 显示当前页的 前或后几页(页码)
        """

        import copy
        query_dict = copy.deepcopy(request.GET)#复制query
        query_dict._mutable = True #设置query可以修改
        self.query_dict = query_dict
        self.page_param = page_param # 获取分页的参数,在分页组件中是 "page"

        page = request.GET.get(page_param, "1")
        #默认值是字符串的1是为了能够支持更多可能的数据类型,
        #可能以后我们封装数据接口的时候不一定是数据类型,
        #所以要把转化为int的工作放在下面的代码中

        if page.isdecimal():
            page = int(page)#转化为int类型
        else:
            page = 1

        self.page = page
        self.page_size = page_size # 每一页记录个数

        self.start = (page - 1) * page_size # 记录开始的区间
        self.end = page * page_size # 记录结束的区间

        self.page_queryset = queryset[self.start:self.end] #获取当前页码的数据

        #total_count = models.PrettyNum.objects.all().count()  # 统计所有数据记录数
        total_count = queryset.count()# 统计所有数据记录数

        # 页码

        self.plus = 5  # 当前页面 前后几页的数值
        self.total_page= math.ceil(total_count / 10)  # 总共页面数

    def html(self):
        page_str_list = []
        if self.total_page < 2 * self.plus + 1:  # 页面过少,起始和结束页码改为1和总页面数
            start_page = 1
            end_page = self.total_page
        elif self.page < 1 + self.plus:  # 避免出现负数页码
            start_page = 1
            end_page = self.page + self.plus
        elif self.page + self.plus > self.total_page:  # 避免超过总页数
            start_page = self.page - self.plus
            end_page = self.total_page  # +1是因为range闭区间
        else:
            start_page = self.page - self.plus  # 当前页面
            end_page = self.page + self.plus
        # 首页
        self.query_dict.setlist(self.page_param, [1])
        page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))

        # 上一页
        if self.page <= 1:
            self.query_dict.setlist(self.page_param, [1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_param, [self.page - 1])
            prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(prev)

        # for i in range(1, 21):
        for i in range(start_page, end_page + 1):  # (306/10)=30.6->向上取整31 ->因为range右边闭区间还要+1
            if i == self.page:  # 如果是当前所在页面,添加激活样式
                self.query_dict.setlist(self.page_param, [i])
                ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(),i)  # 生成多行页码li
            else:
                self.query_dict.setlist(self.page_param, [i])
                ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(),i)  # 生成多行页码li
            page_str_list.append(ele)  # 添加到一个列表中

        # 下一页
        if self.page < self.total_page:  # 判断是否超过总页数
            self.query_dict.setlist(self.page_param, [self.page + 1])
            next = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_param, [self.total_page])
            next = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(next)
        # 尾页
        self.query_dict.setlist(self.page_param, [self.total_page])
        page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))

        # 分页搜索框
        search_string = '''
             <form method="get">
            <div class="input-group" style="width:200px">
            <input type="text" name="page" class="form-control" value="" placeholder="页码">
            <span class="input-group-btn">
            <button class="btn btn-default" type="submit">跳转</button></span>
                    </div>
                </form>
            '''
        page_str_list.append(search_string)

        # page_string = "".join(page_str_list)  # 用""分隔符将列表页码的代码连接形成的字符串,需要加个安全信任才能变成html
        page_string = mark_safe("".join(page_str_list))  # 用""分隔符将列表页码的代码连接形成的字符串,需要加个安全信任才能变成html
        return page_string

4.3 搜索小bug

搜索框出现None
原因:没有给搜索关键词q设置默认值

search_data = request.GET.get("q")
# 将上一行替换为下面的代码即可
search_data = request.GET.get("q","")

5. 应用分页组件,几行代码实现用户管理分页

5.1 批量创建用户,增加用户数量

因为用户表有个创建时间,会有时区问题,需要先修改setting.py中的设置
Django项目中设置USE_TZ=False
在这里插入图片描述

for i in range(300):
	models.UserInfo.objects.create(name="张龙分身{}".format(i),password="123456",age=1,account=1,gender=1,create_time="2023-03-15 10:00:17.000000", depart_id=1)

5.2 修改user_list.html

放入

        <ul class="pagination">
            {{ page_string }}
        </ul>

完整代码:

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
    <div style="margin-bottom: 10px" class="clearfix">
        <a class="btn btn-success" href="/pretty/add/">
            <span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>
            新建靓号
        </a>
        <div style="float: right;width: 300px;">
            <form method="get">
                <div class="input-group">
                    <input type="text" name="q" class="form-control" placeholder="Search for..."
                           value="{{ search_data }}">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">
                            <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                        </button>
                      </span>
                </div>
            </form>
        </div>

    </div>
    <div class="panel panel-default">
        <!-- Default panel contents -->
        <div class="panel-heading">
            <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
            靓号列表
        </div>

        <!-- Table -->
        <table class="table table-bordered">
            <thead>
            <tr>
                <th>ID</th>
                <th>号码</th>
                <th>价格</th>
                <th>级别</th>
                <th>状态</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            {% for obj in queryset %}
                <tr>
                    <th>{{ obj.id }}</th>
                    <td>{{ obj.mobile }}</td>
                    <td>{{ obj.price }}</td>
                    <td>{{ obj.get_level_display }}</td>
                    <td>{{ obj.get_status_display }}</td>
                    <td>
                        <a class="btn btn-primary btn-xs" href="/pretty/{{ obj.id }}/edit/">编辑</a>
                        <a class="btn btn-danger btn-xs" href="/pretty/{{ obj.id }}/delete/">删除</a>
                    </td>
                </tr>
            {% endfor %}

            </tbody>

        </table>


    </div>
    <div class="clearfix">
        <ul class="pagination">
            {{ page_string }}
        </ul>
    </div>
    </div>


{% endblock %}

5.3 修改view.py

def user_list(request):
    """ 用户管理 """
    # 获取所有用户列表 [obj,obj,obj]
    queryset = models.UserInfo.objects.all()

    page_object = Pagination(request, queryset, page_size=5)
    context = {
        "queryset": page_object.page_queryset,
        "page_string": page_object.html(),
    }
    return render(request, 'user_list.html', context)

在这里插入图片描述


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python 网页Web开发知识!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中
『01. 安装配置Django』
『02. 创建并运行一个Django项目』
『03. 初识Django』
『04. 请求和响应,网页跳转重定向,实战简易表单模拟登陆』
『05. 数据库操作,实战用户管理』
『06. 报错:You have 26 unapplied migration(s). Your project may not work properly until you apply the migra』
『07. 模板语法』
『08. 实战项目:部门和员工管理系统(01)』
『09. 实战项目:员工编辑删除功能与靓号管理(02)』
『10. 实战项目:靓号搜索功能(03)』
『11. 实战项目:分页与页码跳转功能(04)』
『12. 实战项目:分页组件的封装 面向接口编程(05)』
『13. 实战项目:添加用户时的时间选择组件(06)』
『14. 实战项目:一些面向对象的代码结构优化(07)』
『15. 实战项目:管理员增删改查,md5密码和密码重置(08)』
『16. 实战项目:BootStrap类的进一步优化(09)』
『17. 实战项目:login业务涉及cookie、session、中间件(10)』
『18. 实战项目:登录时的验证码(11)』
『19. 实战项目:初识Ajax请求(12)』
『20. 实战项目:Ajax实战之订单管理与弹出对话框(13)』
『21. 实战项目:echart数据图表(14)』
『22. 实战项目:简单的文件上传(15)』
『23. 实战项目:Excel和form和moudleForm的文件上传(16)』
【更多内容敬请期待】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『 MySQL篇 』:MySQL 索引相关问题

目录 一 . 认识索引 二. 索引的数据结构 1 . B Tree vs Hash 2 . B Tree vs 二叉树/红黑树 3 . B 树 vs B树 三. 索引的使用 1. 索引分类 2. 索引用法 一 . 认识索引 当我们在查询一本书中的内容时 , 你会选择翻页每一页去查询呢 ? 还是说按照书的目录去找 ? 答案是…

springmvc(一)

SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介 请求与响应 REST风格 SSM整合(注解版) 拦截器 SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用…

微信小程序开发:微信小程序生命周期总结

前言 在微信小程序开发中&#xff0c;关于微信小程序API的使用是必备技能&#xff0c;但是关于微信小程序的生命周期也是首先要了解和掌握的知识点。尤其是现在的前端开发领域&#xff0c;关于前端的各种框架和技术都要会&#xff0c;而且微信小程序的语法就是JS的翻版&#xf…

Java 线程安全

一、什么是线程安全 当多个线程访问共享资源时&#xff0c;每个线程都会各自对共享资源进程操作&#xff0c;导致数据不一致&#xff0c;造成程序不能正确的得到结果&#xff0c;此时需要让多个线程排队访问共享资源&#xff0c;让线程安全&#xff0c;才能保证数据安全的被访问…

Jdk动态代理和Cglib动态代理的区别

一&#xff1a; 前言&#xff1a; 代理模式分为 静态代理 和 动态代理&#xff0c;今天我要讲的是动态代理的两种常见、也是被广泛使用的实现方式-------jdk动态代理 和 Cglib动态代理 二&#xff1a;Jdk动态代理实现分析&#xff1a; 结构示意图如下&#xff0c;我定义了一…

FrIf-FrIf_Transmit发送流程【配置参数FrIfImmediate:立即传输还是解耦传输】和代码分析

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 FrIf_Transmit中的 PDU 的配置的传输模式2 代码分析1 FrIf_Transmit中的 PDU 的配置的传输模式 每当FrIf的上层模块想要请求特定 PDU 的传输时,它都会调用 FrIf_Transmit 函数。调用 FrIf_Transmit的时候传递…

C语言--文件操作

目录前言什么是文件程序文件数据文件文件指针FILE结构的维护文件的打开和关闭文件的打开方式文件的顺序读写fputcfgetcfputsfgetsfprintffscanf文件流 标准输入/输出流sscanf和sprintf前言 在讲文件操作之前&#xff0c;我们先来思考这个问题&#xff1a; 我们为什么要使用文件…

大数据技术之Spark(一)——Spark概述

大数据技术之Spark&#xff08;一&#xff09;——Spark概述 文章目录前言一、Spark基础1.1 Spark是什么1.2 Spark VS Hadoop1.3 Spark优势及特点1.3.1 优秀的数据模型和丰富计算抽象1.3.3 spark的特点1.4 Spark 运行环境1.5 Spark运行架构1.5.1 Driver1.5.2 Executor1.5.3 Mas…

Java设计模式-4、适配器模式

适配器模式 在我们的应⽤程序中我们可能需要将两个不同接⼝的类来进⾏通信&#xff0c;在不 修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。 这个中间件就是适配器。所谓适配器模式就是将⼀个类的接⼝&#xff0c;转换成客 户期望的另⼀个接⼝。它可以让原…

【协议】03、深度解剖之HTTP协议

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的标准、约定或者规则的集合&#xff0c;超文本传输协议(HTTP)是一种通信协议&#xff0c;它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。使用的默认端口为80端口。浏览器的默认端口也是80端…

【操作系统】第二章:进程管理

第二章&#xff1a;进程管理 OVERVIEW第二章&#xff1a;进程管理一、进程与线程1.进程概述&#xff08;1&#xff09;进程PCB&#xff1a;&#xff08;2&#xff09;进程的组成&#xff1a;&#xff08;3&#xff09;进程的特征&#xff1a;2.进程的状态与转换&#xff08;1&a…

基于储能进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

算法练习随记(三)

1.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#x…

如何用AI玩转IG广告,打造高互动的引流营销?

如何用AI玩转IG广告&#xff0c;打造高互动的引流营销&#xff1f;相信做引流的卖家&#xff0c;都有接触过IG广告&#xff0c;然而流量引过来了&#xff0c;怎么处理客户的私信&#xff1f; 私信对话是你与粉丝培养深度关系的管道&#xff0c;好的互动不仅能养成高黏着度的铁粉…

5 个Python高级特性让你在不知不觉中成为Python高手

你已经使用 Python 编程了一段时间&#xff0c;编写脚本并解决各种问题。是你的水平出色吗&#xff1f;你可能只是在不知不觉中利用了Python的高级特性。 从闭包&#xff08;closure&#xff09;到上下文管理器&#xff08;context managers&#xff09;&#xff0c;本文给出一…

Linked List

链表在力扣上的介绍&#xff1a;链表&#xff08;Linked List&#xff09;是最简单的线性的、动态数据结构。理解它是理解树结构、图结构的基础。区别于数组&#xff0c;链表中的元素不是存储在内存中连续的一片区域&#xff0c;链表中的数据存储在每一个称之为「结点」复合区域…

五、传输层

&#xff08;一&#xff09;TCP传输控制协议 可靠的、面向连接的字节流服务&#xff0c;全双工&#xff0c;有端口寻址功能 1、TCP的三种机制 1.使用序号对分段的数据进行标记&#xff0c;便于调整数据包 2.TCP使用确认、校验和和定时器系统提供可靠性 3.TCP使用可变大小的…

ACK Net Exporter 与 sysAK 出击:一次深水区的网络疑难问题排查经历

作者&#xff1a;谢石、碎牙 不久前的一个周五的晚上&#xff0c;某客户A用户体验提升群正处在一片平静中&#xff0c;突然&#xff0c;一条简短的消息出现&#xff0c;打破了这种祥和&#xff1a; “我们在ACK上创建的集群&#xff0c;网络经常有几百毫秒的延迟。" 偶发…

C++模板基础(四)

函数模板&#xff08;四&#xff09; ● 函数模板的实例化控制 – 显式实例化定义&#xff1a; template void fun(int) / template void fun(int) //header.h template<typename T> void fun(T x) {std::cout << x << std::endl; }//main.cpp #include&quo…

Python(白银时代)——文件操作

文件的基本操作 概念 在计算机中&#xff0c;文件是以 二进制 的方式保存在磁盘上的 文本文件 和 二进制文件 文本文件&#xff08;用记事本打开能直接能看懂的&#xff09; 可以使用 文本编辑软件查看 本质上还是二进制的,比如 Python的源码文件 二进制文件&#xff08;用…