自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 python 进阶(三):面向对象进阶——从“会写 class”到设计可维护的后端对象

本文系统讲解了面向对象编程的核心概念与工程实践,涵盖类的定义、属性控制(@property)、继承与super()、多态、抽象类(ABC)、组合优于继承原则,以及@dataclass、魔术方法、类方法与静态方法等高级特性。强调类应清晰组织数据、行为与职责,倡导通过组合实现灵活扩展,避免滥用继承。结合真实后端项目结构,提出模块化设计思想,为后续学习类型标注打下基础。

2026-10-20 22:15:52 320

原创 Python 高阶语法(二):上下文管理器、with、yield 与资源安全释放——从文件到 FastAPI 数据库会话

本文系统讲解Python资源管理的核心机制,重点解析with语句背后的__enter__与__exit__原理,通过文件、数据库连接等实例说明为何必须正确释放资源。介绍了contextmanager和yield实现上下文管理器的简洁方式,并延伸至异步场景的asyncwith,结合FastAPI的get_db依赖与lifespan生命周期函数,揭示其底层均基于同一设计思想:确保资源申请、使用、释放的完整闭环,避免泄漏,提升系统稳定性。

2026-10-09 17:58:21 346

原创 Python 高阶语法(一):高阶函数、闭包、lambda 与 functools——从底层真正理解装饰器

本文深入解析Python函数作为“一等对象”的核心机制,揭示函数可赋值、传参、返回的底层原理。通过高阶函数、lambda匿名函数、闭包等概念,阐明装饰器的本质是“高阶函数+闭包”的组合应用,并结合FastAPI、权限校验、日志统计、缓存优化等真实场景,展示其在项目中的广泛应用。强调@wraps、functools.partial、lru_cache等工具的重要性,帮助开发者理解框架源码与高效编程逻辑。

2026-10-06 20:32:05 188

原创 Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战

本文系统讲解Python核心编程概念与FastAPI后端开发入门,涵盖函数封装、类与对象、装饰器、迭代器与生成器、asyncio异步编程,并通过实战项目实现任务管理API。重点展示Pydantic参数校验、HTTPException异常处理、路径与查询参数使用,以及FastAPI与asyncio的协同机制,为构建高性能Web服务奠定基础。

2026-09-18 17:03:01 104

原创 Python常用容器与导入语法详解(二)

本文系统介绍了Python中常用的容器与队列机制:queue.Queue(线程安全队列)、asyncio.Queue(异步协程通信)、array(固定类型数组)及collections模块中的deque、Counter、defaultdict、heapq等。通过对比不同场景下的适用选择,结合综合案例演示数据统计、分组、滑动窗口与最慢任务查找,并总结常见错误,帮助开发者掌握容器的使用原则与最佳实践,为后续学习函数、类、异步编程打下基础。

2026-09-17 16:51:33 268

原创 Python常用容器与导入语法详解(一)

本文系统介绍Python常用容器及其用法,涵盖list、tuple、dict、set、deque、defaultdict、Counter、heapq、queue.Queue及asyncio.Queue等。内容包括导入语法、创建与操作方法、时间复杂度、适用场景及常见错误。重点讲解列表推导式、字典键要求、元组解包、堆操作、队列选择策略,并通过统计工具调用案例展示综合应用。最后提供容器快速选择表,帮助开发者根据需求高效选用合适数据结构。

2026-09-17 15:28:50 255

原创 LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器

本文系统介绍了构建RAG(检索增强生成)应用的核心组件:通过OutputParser解析模型输出,使用Document管理文档与元数据,借助DocumentLoader加载多源资料,经TextSplitter切分文本块,利用Embedding实现文本向量化,存入VectorStore并支持相似度检索。Retriever提供统一检索接口,结合PromptTemplate与模型生成精准回答。最终通过RAG链整合检索与生成,实现基于企业文档、PDF等私有知识的准确问答,为构建企业级知识库系统奠定基础。

2026-09-15 16:33:36 249

原创 LangChain 能力详解!:核心组件入门——消息、提示词模板与 Few-Shot 少样本!

本文系统介绍了LangChain的三大核心组件:消息(Messages)、提示词模板(PromptTemplate)与少样本提示(Few-Shot)。重点讲解了消息的结构与多轮对话管理,通过trim_messages优化上下文;利用PromptTemplate和ChatPromptTemplate实现提示词的可复用与标准化;借助MessagesPlaceholder动态注入历史对话;并通过Few-Shot示例提升模型输出一致性,结合语义相似度与MMR算法实现高效示例选择。

2026-09-15 16:19:05 64

原创 LangChain能力详解!:从工具调用到 LangSmith——让聊天模型具备实时交互能力!

本文系统讲解了LangChain聊天模型的进阶能力:通过bind_tools()绑定工具并实现工具调用闭环,掌握tool_choice强制调用机制;利用TavilySearch获取实时信息;结合Pydantic实现结构化输出,提升数据可处理性;支持stream()和astream()流式输出,优化用户体验;并通过LangSmith实现全流程可观测性,便于调试复杂LLM应用。内容涵盖工具调用、结构化输出、流式传输与链路追踪,为构建高效可靠的AI Agent奠定基础。

2026-09-12 16:38:30 353

原创 LangChain到底能干嘛!

本文介绍 LangChain 的核心使用思路:Runnable 为模型、解析器等组件提供统一调用接口,LCEL 可通过管道符将多个组件组合成链。文章进一步讲解聊天模型的云端、本地接入方式,以及工具调用的完整流程,包括工具定义、Schema、绑定、模型生成调用请求、程序执行工具并回传结果。掌握这些基础能力后,就能为后续构建 RAG 和 Agent 智能体打下基础。

2026-08-28 15:26:25 350

原创 深入理解linux进程

本文全面解析Linux系统中的进程机制,从基本概念到内核实现。进程作为资源分配的基本单位,本质上是内核数据结构(task_struct)与程序代码的结合体。文章详细阐述了进程的创建(fork系统调用)、7种核心状态(R/S/D/T/Z/X)及其转换,重点分析了僵尸进程(资源泄漏风险)和孤儿进程(被init进程领养)的形成机制。同时介绍了进程优先级(PRI/NI)的调整方式,以及进程独立性、并行并发等特性。掌握这些知识对Linux系统开发、性能优化和故障排查具有重要意义,是多进程编程和系统调度的基础。

2026-03-22 20:00:42 815 17

原创 撕 STL 系列:封装红黑树实现 mymap 和 myset

本文基于SGI-STL源码,探讨了如何通过泛型思想复用红黑树实现自定义的mymap和myset。核心在于设计红黑树的泛型适配,通过模板参数K、T、KeyOfT区分set(存储Key)和map(存储键值对)的不同需求。关键点包括:KeyOfT仿函数统一提取Key进行比较,实现红黑树节点的泛型复用;map的operator[]通过插入+返回引用实现一键访问/修改;迭代器基于中序遍历实现。测试验证了容器功能,展示了泛型编程、仿函数设计等C++核心技术,为深入理解STL容器底层原理提供了实践基础。

2026-03-15 21:17:14 668 2

原创 红黑树的原理及实现

红黑树是一种自平衡二叉搜索树,通过结点颜色约束实现近似平衡,保证操作时间复杂度为O(logN)。其核心规则包括:结点为红或黑、根结点为黑、无连续红结点、路径黑结点数相同。相较于AVL树,红黑树旋转次数更少,广泛应用于STL等库中。本文详细讲解了红黑树的结构设计、旋转操作、插入实现(分三种情况处理)以及平衡验证方法。插入操作需根据叔叔结点颜色进行变色或旋转调整,最终确保满足所有平衡规则。验证时需检查根结点颜色、连续红结点及路径黑结点数是否一致。

2026-03-14 09:28:06 738 21

原创 二叉搜索树

摘要:二叉搜索树是一种特殊的二叉树结构,具有左子树节点值小于等于根节点、右子树节点值大于等于根节点的特性。其性能与树形结构密切相关,最优情况下时间复杂度为O(logN),最差退化为O(N)。文章详细介绍了二叉搜索树的插入、查找和删除操作的具体实现方法,包括四种删除情况的处理策略,并提供了C++代码实现示例。其中删除操作最为复杂,特别是处理同时存在左右子节点的情况需要采用替换法。文章还指出二叉搜索树的局限性,为后续平衡二叉树等高级数据结构的学习做了铺垫。

2025-12-12 22:28:59 780 34

原创 多态概念及使用

摘要:本文详细讲解了C++中的多态概念,重点介绍运行时多态的实现。通过虚函数重写机制,派生类可以覆盖基类虚函数,实现同一函数调用产生不同行为的效果。文章阐述了多态的两个必要条件:必须通过基类指针或引用调用虚函数,且虚函数必须完成重写。同时探讨了虚函数重写中的特殊情况,如协变和析构函数重写,并强调了基类析构函数设为虚函数的重要性。最后介绍了C++11新增的override和final关键字,用于检测虚函数重写和限制重写功能。

2025-11-28 23:21:03 1059 48

原创 继承的概念及使用

摘要:本文介绍了面向对象编程中的继承机制。继承允许派生类复用基类代码并进行扩展,形成层次结构。文章阐述了继承的定义、访问权限控制(public/protected/private继承)以及基类和派生类之间的转换规则(切片现象)。同时说明了继承中的作用域问题,包括同名成员变量的隐藏规则和成员函数隐藏的条件(仅需函数名相同)。最后给出了继承类模板的示例(stack继承vector)和使用注意事项。继承机制能有效减少代码冗余,提高开发效率。

2025-11-10 23:33:44 1717 59

原创 模板的进阶

本文深入探讨了C++模板的高级应用,包括非类型模板参数和模板特化。非类型模板参数允许使用常量作为模板参数,需在编译期确定,仅支持整型(C++20后支持浮点数)。文章详细介绍了函数模板特化和类模板特化(全特化与偏特化),并通过日期类示例演示了指针类型特化。最后指出模板分离编译的局限性,建议将模板声明和定义放在同一文件中以避免链接错误。这些高级模板技术能提升代码的灵活性和安全性。

2025-10-27 09:00:00 2157 62

原创 list的使用和模拟实现

本文主要介绍了C++中list容器的基本使用和模拟实现。首先展示了list的多种初始化方式(空链表、直接初始化、迭代器初始化等)和常用操作(头尾插入删除、查找排序等),重点讲解了erase操作导致的迭代器失效问题及解决方法。其次通过自定义类型示例分析了push_back和emplace_back的效率差异。最后详细讲解了list的模拟实现过程,包括节点结构、迭代器设计(普通/const迭代器)以及核心成员函数的实现(插入删除等),并提供了完整的测试代码。文章强调list与vector的异同,帮助读者深入理解

2025-10-16 21:16:35 1213 63

原创 vector的模拟实现

本文介绍了如何通过模拟实现vector来深入理解其底层原理。文章首先搭建了一个简单的vector框架,包含三个私有迭代器(_start、_finish、_end)和基本函数(size、capacity等)。作者强调在初学阶段要边写边编译以便及时发现错误。框架中预留了reserve和push_back等关键函数的实现位置,并说明了各迭代器的含义:_start指向初始数据,_finish指向有效数据末尾,_end表示容量末尾。最后指出下一步将逐步完善插入、删除等常用功能函数。这种实践方式有助于更好地掌握。ect

2025-09-18 21:48:08 1786 69

原创 vector的使用

C++中vector是动态数组容器,具有自动扩容、内存连续存储等特点。文章介绍了vector的基本使用:构造函数初始化(空vector、指定元素值、迭代器初始化等)、迭代器遍历(正向/反向)、容量操作(size/capacity/reserve/resize)以及常用接口(push/pop/insert/erase/swap)。特别指出不同编译器下扩容策略差异(VS1.5倍/g++2倍)。最后通过OJ例题(单身数字、杨辉三角)展示vector的实际应用优势,如简化二维数组实现。

2025-09-07 16:41:28 1424 71

原创 string类的模拟实现

本文主要探讨了C++中string类的模拟实现,重点分析了构造函数和析构函数的实现方式。文章首先指出浅拷贝会导致多个对象共享同一资源,从而引发程序崩溃的问题,并介绍了通过深拷贝解决这一问题的两种方法:传统写法和现代写法。现代写法通过临时对象和swap函数实现资源转移,代码更简洁健壮。随后详细给出了string类的完整模拟实现代码,包括构造函数、拷贝控制、容量操作、元素访问、迭代器、修改操作、查找功能等核心功能,并实现了相关的运算符重载。

2025-07-30 17:24:22 1487 77

原创 string类

本文介绍了C++标准模板库(STL)中的string类及其应用。STL作为C++的重要组成部分,提供了高效的数据结构和算法,其中string类专门用于字符串管理,相比C语言中的字符串操作更加便捷。文章详细讲解了string类的基本使用方法,包括初始化、拼接、查找、替换等操作,并介绍了auto关键字和范围for循环等C++11特性在字符串处理中的应用。此外,还列举了string类常用的接口函数,如访问、遍历、修改等操作,推荐通过官方文档深入学习。掌握string类能显著提升字符串处理效率,为后续学习STL其他

2025-07-23 18:56:14 1684 57

原创 模板初阶和C++内存管理

本文介绍了C++中的模板编程和内存管理机制。函数模板通过泛型编程实现代码复用,解决函数重载带来的维护问题,支持隐式和显式实例化。类模板类似,但使用时需指明具体类型。内存管理部分对比了C语言的malloc/calloc/realloc与C++的new/delete,后者能自动调用构造/析构函数。文章还分析了内存分布(栈、堆、静态区、常量区)和动态内存管理注意事项,强调new/delete与malloc/free在自定义类型处理上的关键差异。

2025-07-18 20:47:18 1521 44

原创 类和对象(下)

摘要:本文探讨了C++中构造函数初始化列表的使用方法,强调其对引用、const成员和自定义类型初始化的重要性。介绍了C++11的类型转换特性、静态成员函数和变量的特点,以及友元函数和内部类的应用场景。最后讲解了匿名对象的生命周期和使用场景,为C++面向对象编程提供了实用指导。

2025-07-14 16:06:39 1232 49

原创 类和对象(中2)

本文详细介绍了C++运算符重载的实现方法与应用场景,重点阐述了赋值运算符重载的特性: 赋值运算符必须重载为成员函数,参数建议使用const引用,返回值建议返回当前类引用以支持连续赋值; 默认赋值运算符完成浅拷贝,资源管理类需自行实现深拷贝; 通过日期类案例展示了比较运算符、算术运算符等重载实现,包括前置/后置++的区别处理; 特殊运算符重载注意事项:<<和>>需重载为全局函数,部分运算符不可重载; 取地址运算符重载通常使用默认实现,特殊场景可自定义返回地址。 文中提供了完整的日期类实

2025-07-09 14:58:27 1227 55

原创 类和对象(中1)

默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解一下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面再讲解。默认成员函数很重要,也比较复杂,我们要从两个方面去学习:• 第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。

2025-05-28 20:52:24 1378 62

原创 类和对象(上)

一.类的定义一.类的定义1.1 类定义格式class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_ ,注意C++中这个并不是强制的,只是一些惯例。

2025-05-21 22:23:33 1420 53

原创 C++入门基础(下)

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)。全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现。

2025-05-12 21:36:00 1405 51

原创 C++入门基础(上)

1.上面使用C语言出现了重命名的问题,但是我们可以在C++中使用namespace关键字来处理这个问题。• 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即 可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。•namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变 量,所以下面的rand不在冲突了。•C++中域有函数局部域,全局域,命名空间域,类域;

2025-05-06 20:50:17 1409 54

原创 排序2(数据结构)

一. 交换排序一. 交换排序交换排序基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。。1.1 冒泡排序冒泡排序我们在很早之前就讲过,是一种比较基本的排序,之所以叫冒泡排序是因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。所以我们这里就直接给代码,不详细解答了。那么对于冒泡排序的时间复杂度也是很好分析的,它的时间复杂度是O(N^2),空间复杂度是O(1)。1.2 快速排序。

2025-04-29 21:35:07 1263 53

原创 排序(数据结构)

一. 排序概念及运用一. 排序概念及运用排序在数据结构中是非常重要的一部分,。在生活中也有很多的应用,比如当我们搜索一款产品时候,我们可以选择按销量多少的顺序来给我们推荐产品,也可以按照价格高低来给我们推荐产品,所以排序在生活中也是很常见的。1.1 直接插入排序常见的排序算法:上面就是一些常见的排序算法,首先我们来认识一下插入排序,插入排序又分为直接插入排序和希尔排序。

2025-02-25 16:46:02 2274 96

原创 实现二叉树_堆

上面就是对于堆这样一个数据结构中数据的插入、删除、以及如何完成我们想要的大堆还是小堆等,通过算法一一实现。

2025-01-20 21:30:34 4246 77

原创 二叉树_堆

上面通过图片的形式表示出来,大家可能会更清楚一点,首先树中的每一个结点都是一样的结构,有孩子和兄弟,就拿上图来说,首先A的孩子结点指向B,同时B的兄弟结点指向C,这样就可以满足B和C的父节点是A,与树的形状一致,同理B的孩子结点指向D,D的兄弟结点再指向E,E的兄弟结点再指向F,以此类推,我们就可以利用这个方法完成数的结构了。,树形结构中,子树之间不能有交集,否则就不是树形结构;数的结构是有些许复杂的,可能每一个结点可能会有不一样数量的孩子结点等,可能数量会非常多,所以我们来介绍一种比较常用的类型,叫做。

2024-12-18 18:39:19 1555 113

原创 栈和队列(数据结构)

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。

2024-11-25 20:29:15 1400 117

原创 单链表算法题(数据结构)

看到这个题目的时候我们怎么去想呢?如果我们反应快的话,应该可以想到我们可以从1遍历到5然后依次头插,但是其实我们还有更好的办法,就是利用三个指针,如何使用呢?

2024-11-11 22:50:06 3767 107

原创 单链表的实现(数据结构)

我们在上一篇中简单的认识了链表的组成和结构,并打印出链表,那么今天就来具体实现一下单链表对于数据增加、删减、插入等。在实现让任何代码之前,我们都因该将思路理清楚,尾插该注意什么,怎么去是实现?首先一定是要找到最后一个结点,pphead是我们的头结点,我们一贯会将pphead赋给一个新的指针pcur,使用while循环找到最后一个结点,但是如果while里面是pcur的那我们不就直接跳出循环,那我们还怎么找最后一个结点呢?

2024-11-05 23:10:42 6247 109

原创 链表(数据结构)

再上一篇中我们讲到顺序表,但是顺序表也是有很多的问题,像申请的空间过多过少或者增容该才能不浪费空间,今天我们就来认识一个新的知识,叫做链表,链表也是线性表的一种,物理存储结构上非连续、非顺序数据结构的逻辑顺序是通过链表中的指针链接次序实现的。

2024-10-30 22:38:34 2867 104

原创 顺序表(二)(数据结构)

我们看上面的图片,假如现在数组中是1 1 2,现在我们要删除重复项的元素,那么结果应该是1 2,我们可以先使用两个指针,str指向数组的第一个元素,dst指向数组的第二个元素,第一步先将它们两者比较,如果是相等的,仅仅让dst这个指针向后移动一位,再次进行比较,如果此时不相等的话,我们在写算法的时候最重要的是我们的思路,我们该怎么去想,不是为了去解出这个题,而是我们的思路,要扩大我们的思路,多思考,再借鉴别人代码的时候,注意关注的是别人的思路,多多积累一些算法的思路。,返回删除后数组的新长度。

2024-10-28 22:14:48 2363 83

原创 顺序表(一)(数据结构)

比如现在有一个数组包含数据1 2 3 4 ,那么现在我要删除4这个数据,我们知道size是指向有效数据的下一个位置,也就是4的后面一个位置,那么现在我让size--就会让size指向4的位置,当我们打印的时候这个位置的数据就不是有效的数据了,而且在尾部插入数据的时候在空间充足的时候我们是直接将新的数据元素之直接插在size的位置上,然后再让size++。但是在物理结构上并不一定是连续的,物理结构是数据在内存上的存储形式,线性表在物理结构上存储时,通常以数组和链式结构的形式存储。

2024-10-23 23:44:10 2337 94

原创 算法复杂度 (数据结构)

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等。

2024-10-10 22:01:39 3521 131

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除