- 博客(38)
- 收藏
- 关注
原创 Python实现WebSocket聊天室的信息发送过程
摘要 本文介绍了一个基于Python和FastAPI的简易聊天室系统实现。系统采用WebSocket协议实现实时通信,主要包含三个核心部分: WebSocket路由配置:通过FastAPI的include_router整合WebSocket接口路由 连接管理:使用ConnectionManager类维护房间-用户-连接的三级嵌套字典结构,并实现连接管理、断开处理和消息广播功能 业务逻辑处理:包括连接建立时的权限验证、消息接收处理循环,以及消息存储和广播机制 系统实现了多房间支持、用户多连接管理、消息持久化和
2025-11-24 23:10:54
357
原创 Socket:TCP/UDP通信详解
Socket编程实现进程间通信,分为UDP和TCP两种方式。UDP是无连接协议,适用于实时性要求高的场景(如视频流),通过sendto()和recvfrom()实现数据传输。TCP是面向连接的可靠协议,用于文件传输等场景,通过建立连接后使用send()和recv()通信。文章提供了Python实现的服务器和客户端代码示例:基本UDP通信、TCP单线程/多线程处理多客户端连接,以及通过服务器转发实现客户端间通信的完整方案。TCP示例展示了如何维护客户端列表并进行消息广播,实现简单的聊天功能。
2025-11-14 23:05:50
879
原创 CSS基础语法
CSS基础语法与选择器:CSS通过选择器(元素、类、ID等)定位HTML元素,属性定义样式。常用选择器包括后代、子元素、伪类和结构伪类选择器。盒模型由内容、内边距、边框和外边距组成,支持浮动布局(float)和弹性盒(flex)等高级布局方式。CSS特性包括继承性、层叠性和优先级规则。浮动使元素脱离文档流,常配合clear属性清除浮动。
2025-11-03 14:38:34
819
原创 HTML基础语法
本文介绍了HTML基础语法和常用标签,包括:1)标题、段落、链接、图像等基础标签;2)列表、表格、表单等结构化标签;3)div、span等布局标签;4)meta、script等功能性标签;5)音频、视频等多媒体标签;6)header、footer等语义化标签。每种标签都配有示例代码,展示了基本用法和关键属性。文章还特别说明了表单元素的使用方法,如输入框、单选框、复选框、下拉菜单等,是HTML入门的实用参考。
2025-10-28 22:46:32
356
1
原创 Python并发编程
Python并发编程主要包括多线程、多进程和协程三种方式。多线程适合I/O密集型任务,但由于GIL限制无法充分利用多核CPU;多进程可以绕过GIL限制,适合CPU密集型任务;协程则是轻量级的并发方案,适合超多I/O密集型任务。文章详细比较了三者的特点,并提供了多线程爬虫和生产者-消费者模型的实现示例,展示了如何使用queue.Queue实现线程间安全通信。同时解释了GIL的原理及其对Python性能的影响,提出了使用多进程规避GIL限制的方法。
2025-10-26 20:52:35
730
原创 中间件与CORS(基于fastapi)
跨域资源共享(Cross-Origin Resource Sharing,CORS)是一种机制,它允许受限的资源(如字体、JavaScript等)在一个网页上被另一个域的网页访问。简单来说,中间件可以看作是请求和响应之间的一个处理层,可以用来实现一些通用的功能,比如日志记录、身份验证、请求修改等。被特定路径操作处理之前,以及每个响应之后操作。中间件是一个函数,它在每个。
2025-10-20 22:44:49
431
原创 ORM(Tortoise-ORM)操作
就是应用程序提供了一个操作数据的入口,这个入口可以是函数或类方法,也可以是一个URL地址或者一个网络地址,当客户端需要操作数据时,就可以通过调用这个入口来实现。ORM(Object-Relational Mapping)是将对象与关系数据库进行映射的技术,使得开发者可以使用面向对象的方式来操作数据库。Tortoise-ORM是一个流行的Python ORM库,支持异步操作,适合与FastAPI结合使用。应用程序编程接口(Application Programming Interface,API)
2025-10-20 22:43:47
422
原创 jinji2模板
Jinja2是一个流行的Python模板引擎,用于生成动态HTML页面。在FastAPI中,可以使用Jinja2Templates类来处理动态文件的请求。语句**来实现条件分支控制,可以根据不同的条件渲染不同的内容。过滤器用于对变量进行格式化或转换操作,常见的过滤器有**语句**来实现循环控制,可以遍历列表或字典等可迭代对象。(四舍五入)**等。用法是在变量后面加上管道符。,然后跟上过滤器名称。Jinja2提供了**Jinja2提供了**
2025-10-20 22:42:31
220
原创 FastAPI(二)——请求与响应
在FastAPI中,可以通过在路径操作函数中添加Request参数来访问Request对象。在FastAPI中,可以使用Pydantic模型来定义请求体的数据结构。在FastAPI中,可以使用StaticFiles类来处理静态文件的请求。在OAuth2规范的一种使用方式(密码模式)中,客户端通过表单数据提交用户名和密码以获取访问令牌,而不是通过JSON请求体。在FastAPI中,可以使用Jinja2Templates类来处理动态文件的请求。的形式处理,适合大文件上传,可以避免将整个文件加载到内存中。
2025-10-19 22:08:09
317
原创 FastAPI(一)——路径操作
如果有多个子应用,可以分别创建不同的路由文件,然后在主应用中统一引入和注册。将多个子应用的路由集中到主应用中管理。最后这样,访问用户列表的接口就是。
2025-10-19 22:05:09
179
原创 AcWing273 分级
给定长度为 N 的序列 A,构造一个长度为 N 的序列 B,满足:1. B 非严格单调,即 B1≤B2≤…≤BN或 B1≥B2≥…≥BN。2. 最小化 S=∑Ni=1|Ai−Bi|只需要求出这个最小值 S。
2024-08-13 11:21:25
497
原创 欧拉定理和拓展欧拉定理
给你三个正整数,a,m,b,你需要求:a^b mod m(对于 100% 的数据,1≤a≤10^9,1≤b≤10^20000000,1≤m≤10^8)因为b的数值太大,所以用拓展欧拉定理,拓展欧拉定理的第二种情况正好给b降幂。特别的:当m是质数时,
2024-08-08 15:45:44
299
原创 中国剩余定理(普通和拓展)
举个例子,如果建了 3 个猪圈,剩下 1 头猪没有地方安家。如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去,然后如果建造了 7 个猪圈,还有 2 头没有地方去。然后根据步骤运算就可以了,其中用到了extend_gcd(ps:这个真的好常用啊!
2024-08-06 11:11:33
247
原创 威尔逊定理
刚开始,我将need[ ]大小设为3000000,然后下面给need赋值也循环3000000次,明显超时而且超内存,后面发现将上面有prime[ i ](输出need[ n*3+7 ])改为prime[ (i+7)/3 ](输出need[ n ])这样就可以缩小need的大小了。2. p是大于4的合数时,后面为整数,前面为略大于后面的小数,向下取整为0。1. 当p为质数时,前面是整数,后面向下取的整数,结果为1。所以只要统计p是质数的个数就行。
2024-08-05 20:00:43
374
原创 Modulo Ruins the Legend(exgcd问题)
格莱美有一个整数序列 a1,a2,…她认为序列中的元素太多,因此决定在序列中加入一个算术级数。从形式上看,她可以选择两个非负整数 s,d,并在每个 k∈[1,n] 的基础上将 s+kd 加到 ak 中。由于我们想破坏图例,请告诉她操作后元素 modulo m 的最小和。注意,应在取模后将和最小化。其实通过分析就可以列出一个式子。
2024-08-02 19:58:23
830
原创 nowcoder—来点gcd
给定一个有 n个元素的多重集 S,有 m个询问,对于每个询问,给出一个整数 x,问是否能选择 S 的一个非空子集,满足这个子集的 gcd 等于x,当集合只有一个数时,设这个集合的 gcd 就等于这个数,gcd(x,y)的值为x,y的最大公约数。这里其实就是从1开始遍历,判断是否 i 能成为由另两个数组成的gcd,而 i 要能被gcd出来,那一定是要被i的倍数gcd出来,因此,这个判断条件就是判断第一个存放S的数组里面是否有 i 的倍数的这个元素。中途如果找到了,其实可以直接退出的,不用继续循环了。
2024-08-01 15:54:55
303
原创 AcWing203 同余方程
为了找到 x,我们首先需要确保 a 和 b 互素(即 gcd(a,b)=1),因为只有在这种情况下,模反元素才存在。对于 ax≡1(modb)来说,存在唯一 x 满足这个方程。因此,可以直接x=((x%b+b)%b)对于另外一种情况:如果同余方程的一般形式是 ax≡c(modb),其中 c 不是 1,那么需要找到一个 x 满足这个方程。求关于x的同余方程ax≡1(modb)的最小正整数解。输入只有一行,包含两个正整数a,b,用一个空格隔开。输出只有一行,包含一个正整数x,表示最小正整数解。
2024-07-31 10:24:05
395
原创 欧几里得—欧几里得拓展—线性同余方程
即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。欧几里得算法:辗转相除法,用于求两个数的最大公约数。裴属定理:ax+by=gcd(a , b)线性同余方程是最基本的同余方程,形如。)的未知数是 x 的同余式。
2024-07-30 16:02:02
271
原创 赫夫曼树和赫夫曼编码
是一种变长编码,即不等长编码,赫夫曼编码是赫夫曼树的应用之一。赫夫曼编码的特点是没有任何字符的编码是其他字符编码的前缀,所以赫夫曼编码也称为前缀编码。是一种带权路径长度最短的二叉树,也称为最优二叉树。4.根据赫夫曼编码对字符进行编码。3.根据赫夫曼树生成赫夫曼编码。1.统计字符出现的次数。
2024-07-24 10:05:18
333
原创 贪心算法(Load Balancing)
每个测试用例都包含一个整数 N (1<=N<=100000) 和 M (1<=M<=100)。接下来的 N 行包含整数,表示作业 T1、T2Tn 的时间。在这道题,还遇到了一个小插曲,刚开始我用c++写,oj判定超时,想了不少办法简化代码,没有用,后来把输入输出语句改成c语言,就通过了,至少节约800MS的时间,很夸张!对于每个测试用例,首先输出 N,随后的 N 个数字表示我分配给哪个服务器的工作。但是,正如 Wiskey 所知道的,这种寻找最小差距分配的调度问题是 NP 困难的。
2024-07-24 09:58:34
401
原创 Nim尼姆博弈
现在我们不想研究到底先手为胜还是为负,我只想问大家:“先手的人如果想赢,第一步有几种选择呢?sum==0时,先手输,sum!桌子上的扑克全部取光,则游戏结束;下面是一个二人小游戏:桌子上有。这一类型的游戏称为尼姆博弈。
2024-07-22 19:37:32
272
原创 Josephus problem约瑟夫环问题
问题形式:N个人围成一圈,从第一个开始报数,第K个将被杀掉,最后剩下一个,其余人都将被杀掉。当然,当n=0时,jose自然等于0,易得n=1时,jose自然也等于1。每一个n,都能与n-1产生联系,从而根据此写出代码。
2024-07-22 16:45:15
182
原创 为什么要用memset
但是,测试用例全部可以通过,检查了很多次也没有问题,但就是不可以AC。因此,建议以后都使用memset去初始化数字。后来,去找了一下原因,发现用memset。
2024-07-22 16:19:10
216
原创 初次认识subplots
这里 plt.subplots( )里面前两个变量表示的是1行3列,figsize(9,3)表示尺寸为9(横)3(竖),sharex或sharey表示是否共享x轴或y轴。值得注意的是,之前的plt.title()是给整张图命名,而这里我们要set_title()来命名。接下来描点或划线的步骤就和之前的plt一样了。我这里以多元线性回归为示例。
2024-03-24 10:48:59
279
1
原创 线性回归模型
shape函数是Numpy中的函数,它的功能是读取矩阵的长度。plt.scatter用来打印点,提供点,marker(点的样子),color,label。plt.plot用来打印直线,提供起始点,color,label(名称)plt.legend(loc=" ")用来确定点或线的注释区的位置。当然,在此函数里我添加了多次打印,用来表现函数图象的变化。根据此函数,获得当前w,b的cost value。在这里(2,3)表示的是2行3列。最后,我们用代码打印出最终的函数。
2024-03-19 11:17:52
239
原创 Python:list assignment index out of range
此代码运行结果报错IndexError: list assignment index out of range。报错原因:在使用python进行列表操作时,不能直接对空数组指定位置。解决方案:用append()函数。
2024-03-17 11:55:02
1004
2
原创 nextLine()未执行
实际上是因为我打的2.1后有一个回车,而这个回车被nextLine()吞掉了,所以在nextLine前在加一个nextLine来吞掉这个回车即可。
2024-01-21 19:49:56
627
原创 构造函数、析构函数、拷贝函数(拷贝赋值和拷贝构造函数)
下面给一个String类: 构造函数无返回值类型,且在创建对象时被自动调用。当我要使用构造函数的时候,应该如下:当对象离开作用域或被显式地删除时,析构函数被自动调用防止内存泄漏拷贝构造函数下面的拷贝构造函数为深拷贝,使用浅拷贝会发生内存泄漏拷贝赋值函数这里相较于拷贝构造函数的区别是,已经创建好了两个object,我们要先把一个清空,在进行拷贝构造函数的步骤这里检测自我赋值是很有必要的,因为如果this=&str的话,那二者所指向的地址是一样的,一旦进行delete
2023-12-19 11:34:25
573
1
原创 操作符重载&&return by reference
如果c1+=c2+=c3:在这里,为什么操作符重载的返回值不能是void呢?因为,+=最后还要把结果赋值给前者,所以c2+=c3结果的值又要作为参数传递,所以要与操作符重载函数的形参类型相同。如*ths是一个值,而complex&是reference,这是没关系的。在c++里,利用操作符重载,操作符就相当于一种函数。传递者无需知道接受者是以reference形式接受。如:c1(this)+=c2。
2023-12-18 23:22:00
424
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅