Django系列教程(8)——函数视图及通用类视图

目录

什么是视图(View)及其工作原理

接近现实的函数视图

更复杂的案例: 视图处理用户提交的数据

基于函数的视图和基于类的视图

Django通用类视图

a. ListView

b. DetailView

c. CreateView

d. UpdateView

e. FormView

f. DeleteView

小结


Django的视图(view)是处理业务逻辑的核心,它负责处理用户的请求并返回响应数据。Django提供了两种编写视图的方式:基于函数的视图和基于类的视图。本章会详细介绍如何编写视图以及如何使用Django提供的通用类视图。

什么是视图(View)及其工作原理

Django的Web开发也遵循经典软件设计MVC模式开发的。View (视图) 主要根据用户的请求返回数据,用来展示用户可以看到的内容(比如网页,图片),也可以用来处理用户提交的数据,比如保存到数据库中。Django的视图(views.py)通常和URL路由(URLconf)一起工作的。服务器在收到用户通过浏览器发来的请求后,会根据用户请求的url地址和urls.py里配置的url-视图映射关系,去执行相应视图函数或视图类,从而返回给客户端响应数据。

我们先看一个最简单的函数视图。当用户发来一个请求request时,我们通过HttpResponse打印出Hello, World!

# views.py
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, World!")

提示:每个视图函数的第一个默认参数都必需是request, 它是一个全局变量。Django把每个用户请求封装成了request对象,它包含里当前请求的所有信息,比如请求路径request.path, 当前用户request.user以及用户通过POST提交的数据request.POST

上面例子过于简单。在实际Web开发过程中,我们的View不仅要负责从数据库读写数据,还需要指定显示内容的模板,并提供模板渲染页面所需的内容对象(context object)。接下来我们要看一个更接近现实的案例。

接近现实的函数视图

我们依然以blog为例,需要编写两个视图函数,一个用于展示文章列表,一个用于展示文章详情,你的urls.pyviews.py正常情况下应如下所示:

# blog/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('blog/', views.index, name='index'),path('blog/articles/<int:id>/', views.article_detail, name='article_detail'),
]# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article# 展示所有文章
def index(request):latest_articles = Article.objects.all().order_by('-pub_date')return render(request, 'blog/article_list.html', {"latest_articles": latest_articles})# 展示所有文章
def article_detail(request, id):article = get_object_or_404(Article, pk=id)return render(request, 'blog/article_detail.html', {"article": article})

那么上面这段代码是如何工作的呢?

  • 当用户在浏览器输入/blog/时,URL收到请求后会调用视图views.py里的index函数,展示所有文章。
  • 当用户在浏览器输入/blog/article/5/时,URL不仅调用了views.py里的article_detail函数,而且还把参数文章id通过<int:id>括号的形式传递给了视图里的article_detail函数。。
  • views.py里的index函数先提取要展示的数据对象列表latest_articles, 然后通过render方法传递给模板blog/article_list.html.。
  • views.py里的article_detail方法先通过get_object_or_404方法和id调取某篇具体的文章对象article,然后通过render方法传递给模板blog/article_detail.html显示。

在本例中,我们使用了视图函数里常用的2个便捷方法render()get_object_or_404()

  • render方法有4个参数。第一个是request, 第二个是模板的名称和位置,第三个是需要传递给模板的内容, 也被称为context object。第四个参数是可选参数content_type(内容类型), 我们什么也没写。
  • get_object_or_404方法第一个参数是模型Models或数据集queryset的名字,第二个参数是需要满足的条件(比如pk = id, title = ‘python’)。当需要获取的对象不存在时,给方法会自动返回Http 404错误。

下图是模板的代码。模板可以直接调用通过视图传递过来的内容。

# blog/article_list.html{% block content %}
{% for article in latest_articles %}{{ article.title }}{{ article.pub_date }}
{% endfor %}
{% endblock %}# blog/article_detail.html
{% block content %}{{ article.title }}{{ article.pub_date }}{{ article.body }}
{% endblock %}

更复杂的案例: 视图处理用户提交的数据

视图View不仅用于确定给客户展示什么内容,以什么形式展示,而且也用来处理用户通过表单提交的数据。我们再来看两个创建和修改文章的视图函数article_createarticle_update,看看它们是如何处理用户通过表单POST提交过来的数据。

 from django.shortcuts import render, redirect, get_object_or_404from django.urls import reversefrom .models import Articlefrom .forms import ArticleForm# 创建文章def article_create(request):# 如果用户通过POST提交,通过request.POST获取提交数据if request.method == "POST":# 将用户提交数据与ArticleForm表单绑定form = ArticleForm(request.POST)# 表单验证,如果表单有效,将数据存入数据库if form.is_valid():form.save()# 创建成功,跳转到文章列表return redirect(reverse("blog:article_list"))else:# 否则空表单form = ArticleForm()return render(request, "blog/article_form.html", { "form": form, })# 更新文章def article_update(request, pk):# 从url里获取单篇文章的id值,然后查询数据库获得单个对象实例article = get_object_or_404(Article, pk=id)# 如果用户通过POST提交,通过request.POST获取提交数据if request.method == 'POST':# 将用户提交数据与ArticleForm表单绑定,进行验证form = ArticleForm(instance=article, data=request.POST)if form.is_valid():form.save()# 更新成功,跳转到文章详情return redirect(reverse("blog:article_detail", args=[pk,]))else:# 否则用实例生成表单form = ArticleForm(instance=article)return render(request, "blog/article_form.html", { "form": form, "object": article})

我们给每一行代码添加了说明。值得一提的是在创建和更新文章时我们向模板传递了form这个变量,模板会根据我们自定义的Form类自动生成表单。我们还使用了自定义的Form类对用户提交的数据(request.POST)进行验证,并将通过验证的数据存入数据库。

这里所使用ArticleForm实际上是非常简单的,仅包含了titlebody两个字段。

#blog/forms.py
from .models import Article
from django import formsclass ArticleForm(forms.ModelForm):class Meta:model = Articlefields = ['title', 'body']

基于函数的视图和基于类的视图

Django提供了两种编写视图的方式: 基于函数的视图(Function Base View, FBV)和基于类的视图(Class Based View, CBV)。前面案例中的indexarticle_detailarticle_update的方法都是基于函数的视图。函数视图的优点是比较直接,容易读者理解, 缺点是不便于继承和重用。

基于类的视图以class定义,而不是函数视图的def定义。使用类视图后可以将视图对应的不同请求方式以类中的不同方法来区别定义(get方法处理GET请求,post方法处理POST请求),相对于函数视图逻辑更清晰,代码也有更高的复用性。

from django.views.generic import Viewclass MyClassView(View):"""类视图"""def get(self, request):"""处理GET请求"""return render(request, 'register.html')def post(self, request):"""处理POST请求"""return ...

注意:在URL配置文件中使用类视图时,需要使用as_view()将其伪装成方法:

# blog/urls.py
from django.urls import path, re_path
from . import viewsurlpatterns = [path('', views.MyClassView.as_view()),
]

Django通用类视图

在实际Web开发过程中,我们对不同的数据或模型总是反复进行以下同样的操作,使用通用的类视图可以大大简化我们的代码量。

  • 展示对象列表(比如所有用户,所有文章)
  • 查看某个对象的详细信息(比如用户资料,比如文章详情)
  • 通过表单创建某个对象(比如创建用户,新建文章)
  • 通过表单更新某个对象信息(比如修改密码,修改文字内容)
  • 用户填写表单提交后转到某个完成页面
  • 删除某个对象

Django提供了很多通用的基于类的视图,来帮我们简化视图的编写。这些View与上述操作的对应关系如下:

  • 展示对象列表(比如所有用户,所有文章)- ListView

  • 展示某个对象的详细信息(比如用户资料,比如文章详情) - DetailView

  • 通过表单创建某个对象(比如创建用户,新建文章)- CreateView

  • 通过表单更新某个对象信息(比如修改密码,修改文字内容)- UpdateView

  • 用户填写表单后转到某个完成页面 - FormView

  • 删除某个对象 - DeleteView

上述常用通用视图一共有6个,前2个属于展示类视图(Display view), 后面4个属于编辑类视图(Edit view)。下面我们就来看下这些通用视图是如何工作的,如何简化我们代码的。

注意:如果你要使用Edit view,请务必在模型里里定义get_absolute_url()方法,否则会出现错误。这是因为通用视图在对一个对象完成编辑后,需要一个返回链接。get_absolute_url()可以为某个对象生成独一无二的url。

a. ListView

ListView用来展示一个对象的列表。它只需要一个参数模型名称即可。比如我们希望展示所有文章列表,我们的views.py可以简化为:

# Create your views here.
from django.views.generic import ListView
from .models import Articleclass IndexView(ListView):model = Article

上述代码等同于:

# 展示所有文章
def index(request):queryset = Article.objects.all()return render(request, 'blog/article_list.html', {"article_list": queryset})

尽管我们只写了一行model = ArticleListView实际上在背后做了很多事情:

  • 提取了需要显示的对象列表或数据集queryset: Article.objects.all()
  • 指定了用来显示对象列表的模板名称: 默认app_name/model_name_list.html, 即blog/article_list.html.
  • 指定了内容对象名称(context object name):默认值object_list

你或许已经注意到了2个问题:需要显示的文章对象列表并没有按发布时间逆序排列,默认内容对象名称object_list也不友好。或许你也不喜欢默认的模板名字,还希望通过这个视图给模板传递额外的内容(比如现在的时间)。你可以轻易地通过重写querysettemplate_namecontext_object_name来完成ListView的自定义。

如果你还需要传递模型以外的内容,比如现在的时间,你还可以通过重写get_context_data方法传递额外的参数或内容。

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):queryset = Article.objects.all().order_by("-pub_date")template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

如果上述的queryset还不能满足你的要求,比如你希望一个用户只看到自己发表的文章清单,你可以通过更具体的get_queryset()方法来返回一个需要显示的对象列表。

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_queryset(self):return Article.objects.filter(author=self.request.user).order_by('-pub_date')def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

b. DetailView

DetailView用来展示一个具体对象的详细信息。它需要URL传递某个对象的具体参数(如id, pk, slug值)。本例中用来展示某篇文章详细内容的view可以简写为:

# Create your views here.
from django.views.generic import DetailView
from .models import Articleclass ArticleDetailView(DetailView):model = Article

DetailView默认的模板是app/model_name_detail.html,默认的内容对象名字context_object_name是model_name。本例中默认模板是blog/article_detail.html, 默认对象名字是article, 在模板里可通过 ``获取文章标题。

你同样可以通过重写querysettemplate_namecontext_object_name来完成DetailView的自定义。你还可以通过重写get_context_data方法传递额外的参数或内容。如果你指定了queryset, 那么返回的object是queryset.get(pk = id), 而不是model.objects.get(pk = id)。

# Create your views here.
from django.views.generic import ListView,DetailView
from .models import Article
from django.utils import timezoneclass ArticleDetailView(DetailView):queryset = Article.objects.all().order_by("-pub_date") # 一般不写template_name = 'blog/article_detail.html'context_object_name = 'article'def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now()return context

c. CreateView

CreateView一般通过某个表单创建某个对象,通常完成后会转到对象列表。比如一个最简单的文章创建CreateView可以写成:

from django.views.generic.edit import CreateView
from .models import Articleclass ArticleCreateView(CreateView):model = Articlefields = ['title', 'body',]

CreateView默认的模板是model_name_form.html, 即article_form.html。这里CreateView还会根据fields自动生成表单字段。默认的context_object_name是form。模板代码如下图所示:

# blog/article_form.html<form method="post">{% csrf_token %}{{ form.as_p }}<input type="submit" value="Save" />
</form>

如果你不想使用默认的模板和默认的表单,你可以通过重写template_nameform_class来完成CreateView的自定义。

对于CreateView, 重写它的form_valid方法不是必需,但很有用。当用户提交的数据是有效的时候,执行该方法。你可以通过定义此方法做些别的事情,比如发送邮件,存取额外的数据。

from django.views.generic.edit import CreateView
from .models import Article
from .forms import ArticleCreateFormclass ArticleCreateView(CreateView):model = Articletemplate_name = 'blog/article_create_form.html'form_class = ArticleCreateFormdef form_valid(self, form):form.do_sth()return super(ArticleCreateView, self).form_valid(form)

form_valid方法一个常见用途就是就是将创建对象的用户与model里的user结合(需要用户先登录再提交)。见下面例子。

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from .models import Articleclass ArticleCreate(LoginRequiredMixin, CreateView):model = Articlefields = ['title', 'body']def form_valid(self, form):form.instance.author = self.request.userreturn super().form_valid(form)

d. UpdateView

UpdateView一般通过某个表单更新现有对象的信息,更新完成后会转到对象详细信息页面。它需要URL提供访问某个对象的具体参数(如pk, slug值)。比如一个最简单的文章更新的UpdateView如下所示。

from django.views.generic.edit import UpdateView
from .models import Articleclass ArticleUpdateView(UpdateView):model = Articlefields = ['title', 'body',]

UpdateView和CreateView很类似,比如默认模板都是model_name_form.html, 因此它们可以共用一个模板。但是区别有两点:

  • CreateView显示的表单是空表单,UpdateView中的表单会显示现有对象的数据。
  • 用户提交表单后,CreateView转向对象列表,UpdateView转向对象详细信息页面。

你可以通过重写template_nameform_class来完成UpdateView的自定义。

  • 本例中默认的模板是article_form.html, 你可以改为article_update_form.html
  • 虽然form_valid方法不是必需,但很有用。当用户提交的数据是有效的时候,你可以通过定义此方法做些别的事情,比如发送邮件,存取额外的数据。
from django.views.generic.edit import UpdateView
from .models import Article
from .forms import ArticleUpdateFormclass ArticleUpdateView(UpdateView):model = Articletemplate_name = 'blog/article_update_form.html'form_class = ArticleUpdateFormdef form_valid(self, form):form.do_sth()return super(ArticleUpdateView, self).form_valid(form)

另一个进行UpdateView的常用自定义方法是get_object方法。比如你希望一个用户只能编辑自己发表的文章对象。当一个用户尝试编辑别人的文章时,返回http 404错误。这时候你可以通过更具体的get_object()方法来返回一个更具体的对象。代码如下:

from django.views.generic.edit import UpdateView
from .models import Article
from .forms import ArticleUpdateFormclass ArticleUpdateView(UpdateView):model = Articletemplate_name = 'blog/article_update_form.html'form_class = ArticleUpdateFormdef get_object(self, queryset=None):obj = super().get_object(queryset=queryset)if obj.author != self.request.user:raise Http404()return obj

e. FormView

FormView一般用来展示某个表单,而不是用于创建或更新某个模型对象。当用户输入信息未通过表单验证,显示错误信息。当用户输入信息通过表单验证提交后,跳到其它页面。使用FormView一般需要定义template_nameform_classsuccess_url.

见下面代码。

# views.py - Use FormView
from myapp.forms import ContactForm
from django.views.generic.edit import FormViewclass ContactView(FormView):template_name = 'contact.html'form_class = ContactFormsuccess_url = '/thanks/'def form_valid(self, form):# This method is called when valid form data has been POSTed.# It should return an HttpResponse.form.send_email()return super().form_valid(form)

f. DeleteView

DeleteView一般用来删除某个具体对象。它要求用户点击确认后再删除一个对象。使用这个通用视图,你需要定义模型的名称model和成功删除对象后的返回的URL。默认模板是myapp/model_confirm_delete.html。默认内容对象名字是model_name。本例中为article。

本例使用了默认的模板blog/article_confirm_delete.html,删除文章后通过reverse_lazy方法返回到index页面。

from django.urls import reverse_lazy
from django.views.generic.edit import DeleteView
from .models import Articleclass ArticleDelete(DeleteView):model = Articlesuccess_url = reverse_lazy('index')

模板内容如下:

# blog/article_confirm_delete.html<form method="post">{% csrf_token %}<p>Are you sure you want to delete "{{ article }}"?</p><input type="submit" value="Confirm" />
</form>

小结

本章我们详细介绍了Django的视图(View)是如何工作的,并展示了如何使用基于函数的视图和通用类视图(ListViewDetailViewCreateViewUpdateViewDeleteView)编写基本的增删改查视图。在Django进阶部分我们将介绍更多视图编写技巧。下章我们将讲解模板语言, 常见的模板标签和过滤器以及如何正确配置模板文件。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 查找相似颜色算法

下是一个基于欧几里得距离的C#颜色相似度查找算法实现,包含详细注释和优化策略: using System; using System.Collections.Generic;public class ColorMatcher {// 颜色容器 - 使用字典存储颜色ID到RGB的映射private readonly Dictionary<int, byte[]> _colorDictiona…

【A2DP】蓝牙音频编解码器互操作性要求详解

目录 一、音频编解码器互操作性&#xff1a;核心要点总览 二、必选与可选编解码器互操作性要求大盘点 2.1 必选与可选的编解码器支持 2.2 必选编解码器要求 2.3 可选编解码器要求 2.4 厂商自定义&#xff08;Vendor Specific&#xff09;A2DP编解码器互操作性要求 2.5 不…

electron 设置跨域iframe

在 Electron 的主进程中禁用同源策略 在 Electron 的主进程文件中添加 app.commandLine.appendSwitch("disable-site-isolation-trials"); 来禁用站点隔离试验。在创建 BrowserWindow 时&#xff0c;设置 webPreferences 的 webSecurity: false 来禁用同源策略。

c-线程创建,同步互斥,互斥锁;

文章目录 案例描述1代码实现代码解释 案例背景2代码实现代码解析关键概念总结扩展练习 案例描述1 我们将模拟一个简单的售票系统&#xff0c;其中有两个售票窗口同时出售100张票。为了确保不会卖出超过100张票&#xff0c;并且不会出现卖票时的竞态条件&#xff08;race condi…

SpringBoot第二天

目录 1.Web开发 1.1简介 1.2SpringBoot对静态资源的映射规则 1.3模板引擎 1.3.1引入thymeleaf&#xff1b; 1.3.2Thymeleaf语法 1.3.2.1标准表达式语法 1.变量表达式 1.3.2.2表达式支持的语法 1.3.2.3常用的thymeleaf标签 1.4Springboot整合springmvc 1.4.1Springmvc…

Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

一、缓存雪崩&#xff1a; 1、什么是缓存雪崩&#xff1a; 如果缓在某一个时刻出现大规模的key失效&#xff0c;那么就会导致大量的请求打在了数据库上面&#xff0c;导致数据库压力巨大&#xff0c;如果在高并发的情况下&#xff0c;可能瞬间就会导致数据库宕机。这时候如果…

Html5记忆翻牌游戏开发经验分享

H5记忆翻牌游戏开发经验分享 这里写目录标题 H5记忆翻牌游戏开发经验分享前言项目概述技术要点解析1. 页面布局&#xff08;HTML CSS&#xff09;响应式设计 2. 翻牌动画效果3. 游戏逻辑实现状态管理卡片配对检测 开发技巧总结1. 模块化设计2. 性能优化3. 用户体验 踩坑经验扩…

【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search

大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…

Linux网络套接字编程——创建并绑定

目录 网络字节序 socket编程接口 socket bind 如果将进程比作一个房子&#xff0c;那套接字相当于是一扇门&#xff0c;通向与外界通信的通道。 在网络中&#xff0c;如何理解套接字呢&#xff0c;时刻记住套接字是为了标识互联网中的某一台主机上的某一个进程&#xff0c…

1720. 解码异或后的数组

解码异或后的数组 题目描述尝试做法 题目描述 未知整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n - 1 的另一个整数数组 encoded &#xff0c;其中 encoded[i] arr[i] XOR arr[i 1] 。例如&#xff0c;arr [1,0,2,1] 经编码后得到 encoded [1,2,3] 。 给你编…

了解一下HTTP的短连接和长连接

在 HTTP 协议中&#xff0c;连接的方式主要分为长连接和短连接。这两种连接方式的主要区别在于连接的生命周期和数据传输的效率。理解它们的差异对于优化 Web 应用的性能和资源利用至关重要。以下是 HTTP 长连接和短连接的详细解释。 1. 短连接&#xff08;HTTP/1.0&#xff0…

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

查看 WPS 的输入静态地理数据方法总结 方法 1:使用 gdal_translate 将二进制数据转换为 GeoTIFFgdal_translate 工具概述使用 gdal_translate 将二进制数据转换为 GeoTIFF方法 2:使用 ncdump 查看 geo_em.dXX.nc方法 3:使用 Python xarray + matplotlib 可视化 geo_em.dXX.n…

Mybatis语法bug

select * from appointment where status ‘ACCEPTED’ and expire_time< now() idea显示now&#xff08;&#xff09;这里一直报错&#xff1a; 应为标记名称 应为 Deepseek: 根据您的代码和报错信息分析&#xff0c;这是一个 MyBatis XML 文件中的 SQL 语法问题。具体原…

DeepSeek本机部署(基于Ollama和Docker管理)

目录 一、ollama 与 docker 简介 &#xff08;一&#xff09;ollama(Ollama) &#xff08;二&#xff09;docker 二、利用 ollama 和 docker 配置 deepseek-r1 的准备工作 &#xff08;一&#xff09;硬件需求 &#xff08;二&#xff09;软件安装 三、配置 deepseek-r1…

小程序 wxml 语法 —— 39 简单双向数据绑定

在 WXML 中&#xff0c;普通属性的绑定是单向的&#xff0c;比如 <input value"{{ value }}" />&#xff0c;当数据发生改变时&#xff0c;页面也会随之发生变化&#xff0c;但是当用户在输入框中输入最新内容&#xff0c;最新内容并不会同步给 value 数据&…

Linux第一次练习

1、找到你的Linux系统上的不同颜色的文件&#xff0c;每一种颜色的文件找到3个以上 蓝色&#xff1a; 白色&#xff1a; 绿色&#xff1a; 红色&#xff1a; 黄色&#xff1a; 2、设置一个ping的别名永久生效&#xff0c;设置一个ymd的别名date %F永久生效

《C#上位机开发从门外到门内》2-2:I2C总线协议及其应用详解

文章目录 一、引言二、I2C总线协议的基本概念三、I2C通信机制3.1 硬件结构与基本原理3.2 信号的起始与终止3.3 数据传输格式及时序3.4 时钟同步与时钟伸展 四、设备寻址与数据传输4.1 I2C设备寻址方式4.2 地址冲突及解决方法4.3 数据传输过程中的确认机制4.4 I2C数据帧结构与传…

Trae IDE:解锁 AI 驱动的高效编程体验

Trae 介绍 Trae 是字节跳动推出的一款面向开发者的 AI 驱动的集成开发环境&#xff08;IDE&#xff09;&#xff0c;于 2024 年 1 月 19 日在新加坡正式发布海外版&#xff0c;2025 年 3 月 3 日发布国内版。海外版由字节跳动旗下的 SPRING&#xff08;SG&#xff09;PTE.LTD.…

玩转python:通俗易懂掌握高级数据结构:collections模块之namedtuple

引言 namedtuple是Python中collections模块提供的一个强大工具&#xff0c;用于创建具有字段名的元组。它不仅具备元组的不可变性&#xff0c;还能通过字段名访问元素&#xff0c;极大地提高了代码的可读性和可维护性。本文将详细介绍namedtuple的关键用法和特性&#xff0c;并…

我的创作纪念日:730天的技术写作之旅

我的创作纪念日&#xff1a;730天的技术写作之旅 机缘 从一篇案例分析开始 2023年3月13日&#xff0c;我写下了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那时的初心很简单&#xff1a; 沉淀实战经验——在备考软考系统分析师时&#xff0c;发现…