1/30每日一题
从输入 URL 到页面展示到底发生了什么?
1. 输入 URL 与浏览器解析
- 当你在浏览器地址栏输入 URL 并按下回车,浏览器首先会解析这个 URL(统一资源定位符),比如
https://www.example.com
。 - 浏览器会解析这个 URL 中的不同部分:
- 协议(如:
http
或https
):决定了数据传输的方式和安全性。 - 域名(如:
www.example.com
):确定请求的目标服务器。 - 路径(如:
/index.html
):指定了服务器上的资源位置。 - 查询参数(如果有):如:
?id=123&sort=desc
,用于传递额外的信息。
- 协议(如:
2. DNS 解析
- 浏览器将 URL 中的域名(如
www.example.com
)转换成服务器的 IP 地址。这个过程叫做DNS(域名系统)解析。
3. 建立 TCP 连接
- 一旦得到 IP 地址,浏览器就会与目标服务器建立一个 TCP 连接,通常通过 3 次握手的过程。
- 客户端(浏览器)发送 SYN 请求(同步标志位)。
- 服务器返回 SYN-ACK(确认响应)。
- 客户端再次发送 ACK(确认标志)。
- 如果使用的是 HTTPS,还会进行 TLS/SSL 握手,保证数据传输的加密性。
4. 发送 HTTP 请求
5.服务器响应
三次握手的过程,以及为什么是三次,而不是四次,两次?
三次握手的过程
-
第一次握手(客户端 → 服务器)
- 客户端向服务器发送一个 SYN(同步)标志位的 TCP 数据包,表示客户端请求建立连接。
- 同时,客户端会选择一个初始序列号(ISN,Initial Sequence Number),这个序列号是一个随机生成的数字,用于后续的数据传输中的数据包排序和确认。
-
第二次握手(服务器 → 客户端)
- 服务器收到客户端的 SYN 包后,响应一个 SYN-ACK(同步-确认)标志位的 TCP 数据包,表示服务器同意建立连接。
- 服务器会选择自己的初始序列号,并将客户端的序列号加 1,作为 ACK(确认)号返回给客户端。此时,服务器也等待客户端的确认。
-
第三次握手(客户端 → 服务器)
- 客户端收到服务器的 SYN-ACK 包后,发送一个 ACK(确认)标志位的 TCP 数据包,表示客户端已经收到了服务器的响应。
- 客户端将服务器的序列号加 1,作为确认号发送给服务器。
- 至此,客户端和服务器都确认了对方的存在和初始序列号,连接建立完成。
为什么是三次握手,而不是两次或四次?
1. 为什么不是两次握手?
如果只有两次握手,就无法保证服务器是否准备好接收数据。假设只有两次握手的过程:
- 第一次握手:客户端发送 SYN 请求。
- 第二次握手:服务器收到 SYN 包后直接返回 SYN-ACK 包。
这种情况下,客户端无法确认服务器是否成功接收了请求,也无法确认服务器是否准备好接收数据。如果只有两次握手,可能会出现服务器无法接收数据的情况,或者服务器错误地认为客户端已经收到了响应。
三次握手通过客户端和服务器的互相确认,确保了双方的准备状态,避免了这种情况的发生。
2. 为什么不是四次握手?
四次握手实际上是不必要的,因为在三次握手中,双方已经充分确认了对方的状态。四次握手会增加额外的网络延迟和开销,而且在大多数情况下并不需要。
- 四次挥手的过程,以及为什么是四次?
**四次挥手(Four-Way Handshake)**是 TCP 协议中断开连接的过程。它用于确保通信双方都能正确地关闭连接,并且所有未发送的数据能够顺利传输。四次挥手的过程涉及到双方发送和确认的多个信号,确保连接断开是安全和完整的。
四次挥手的过程
-
第一次挥手(客户端 → 服务器)
- 客户端向服务器发送一个 FIN(结束)标志位的 TCP 数据包,表示客户端已经没有数据要发送了,准备关闭连接。
- 这个 FIN 数据包的序列号是客户端发送的最后一个字节的序列号。
-
第二次挥手(服务器 → 客户端)
- 服务器收到客户端的 FIN 包后,表示同意关闭连接,返回一个 ACK(确认)标志位的 TCP 数据包,确认客户端的请求。
- 这个 ACK 数据包的确认号是客户端 FIN 包的序列号 + 1,表示服务器收到了客户端的关闭连接请求。
- 此时,连接的一个方向(客户端 → 服务器)已经关闭,服务器还可以继续向客户端发送数据。
-
第三次挥手(服务器 → 客户端)
- 服务器发送完自己的数据后,准备关闭连接,会向客户端发送一个 FIN 包,表示服务器也没有数据要发送了,准备关闭连接。
- 这个 FIN 包的序列号是服务器发送的最后一个字节的序列号。
-
第四次挥手(客户端 → 服务器)
- 客户端收到服务器的 FIN 包后,确认服务器已经没有数据要发送了,发送一个 ACK(确认)标志位的 TCP 数据包,表示客户端同意关闭连接。
- 这个 ACK 数据包的确认号是服务器 FIN 包的序列号 + 1,表示客户端已经收到了服务器的关闭请求。
- 至此,客户端和服务器都确认连接已经完全关闭,连接进入 TIME_WAIT 状态,最终关闭。
- TCP与UDP的概念,特点,区别和对应的使用场景?
TCP(传输控制协议)和UDP(用户数据报协议)是互联网上两种常见的传输层协议
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。它提供了数据传输的完整性,确保数据包按顺序、无误地传输。
特点
- 面向连接:在数据传输开始前,必须先通过“三次握手”建立连接,通信双方确认连接的存在后才能开始数据传输。
- 可靠性:通过数据确认、重传、流量控制、拥塞控制等机制确保数据传输的可靠性。
- 数据顺序:确保数据按发送顺序到达接收方,避免数据乱序。
- 流量控制:TCP 使用滑动窗口机制进行流量控制,避免发送方过快地发送数据导致接收方缓冲区溢出。
- 拥塞控制:TCP 具有拥塞控制机制(如慢启动、拥塞避免、快速重传等),防止网络拥塞。
- 数据完整性:TCP 为每个数据段提供校验和,确保数据传输的完整性。
优点
- 提供可靠的数据传输,确保数据无误并按顺序到达。
- 可以自动重传丢失的包。
缺点
- 相对较慢,因需要连接建立、确认、重传等过程。
- 占用较多的网络资源,因为每个连接都需要维护连接状态。
使用场景
- 网页浏览:HTTP、HTTPS协议基于TCP,确保网页内容的完整性和顺序加载。
- 文件传输:FTP、SFTP等协议用于文件上传/下载,需要保证数据传输的可靠性。
- 电子邮件:如SMTP、POP3和IMAP等协议,保证电子邮件内容传输的完整性。
- 视频会议:如Zoom、Skype等,保证视频数据按顺序到达,减少中断和错误。
二、UDP(用户数据报协议)
概念
UDP(User Datagram Protocol)是一个无连接、尽力而为的传输层协议。它不保证数据的可靠传输,发送方将数据发送到网络中,并不关心接收方是否收到。
特点
- 无连接:UDP 不需要建立连接,数据传输前不进行连接的建立与确认,发送方和接收方不需要同步。
- 不可靠性:UDP 不提供错误检测和修复机制。如果数据包丢失、乱序或损坏,UDP 不会重新发送。
- 无流量控制:UDP 不会控制数据的发送速度,不关心接收方的接收能力。
- 无拥塞控制:UDP 不会处理网络拥塞问题,可能导致网络过载。
- 低开销:没有建立连接、确认等过程,减少了协议的开销。
优点
- 协议开销小,传输速度快。
- 延迟低,适合对实时性要求高的应用。
缺点
- 不保证数据传输的可靠性,数据包丢失、重复或乱序无法保证。
- 不提供流量控制和拥塞控制,可能会造成丢包和网络过载。
使用场景
- 实时通信:如VoIP(语音通话)、视频直播、视频会议等,要求低延迟,但可以容忍少量的数据丢失。
- DNS查询:域名解析时使用UDP,响应快速,且请求和响应数据小,丢失一个数据包可以重新发起请求。
- 在线游戏:多人游戏常用UDP,因为要求低延迟,玩家位置等数据的实时性远比数据的可靠性更重要。
- 流媒体传输:如实时视频、音频流等,UDP 可以提供低延迟的传输,部分丢包也能接受。
HTTP常见状态码
HTTP状态码是Web服务器响应请求时,服务器向客户端发送的数字代码,用于表示请求的处理结果。状态码分为五类,分别对应不同的意义。
1. 1xx(信息性状态码)
这些状态码表示请求已被接收,正在处理。
- 100 Continue:表示客户端应继续发送请求数据。
- 101 Switching Protocols:表示服务器已经理解了客户端的请求,并且正在切换协议。
2. 2xx(成功状态码)
这些状态码表示请求已成功被服务器接收、理解和处理。
- 200 OK:请求成功,通常用于 GET 和 POST 请求。
- 201 Created:请求成功并且服务器已创建了新的资源。
- 202 Accepted:请求已接受,但尚未处理完成。
- 204 No Content:请求成功,但没有返回任何内容(如删除操作)。
- 205 Reset Content:请求成功,要求客户端重置视图。
- 206 Partial Content:部分内容响应,通常用于断点续传或部分请求的情况。
3. 3xx(重定向状态码)
这些状态码表示客户端需要进一步操作才能完成请求。
- 301 Moved Permanently:请求的资源已被永久移动到新的 URL。
- 302 Found:请求的资源临时性地被移动到新的 URL。
- 303 See Other:客户端应访问其他位置的 URL 进行获取资源。
- 304 Not Modified:请求的资源未修改,客户端可以使用缓存的版本。
- 307 Temporary Redirect:请求的资源临时转移,客户端应继续使用原始 URL。
- 308 Permanent Redirect:请求的资源永久转移,客户端应使用新的 URL。
4. 4xx(客户端错误状态码)
这些状态码表示客户端发出的请求存在错误。
- 400 Bad Request:请求无效或无法理解,通常是客户端发送的数据格式不对。
- 401 Unauthorized:请求要求用户的身份验证,未提供或提供的认证信息无效。
- 403 Forbidden:服务器理解请求,但拒绝执行请求。
- 404 Not Found:请求的资源不存在,URL 错误或者服务器上没有该文件。
- 405 Method Not Allowed:请求方法不被允许,客户端请求了一个不支持的 HTTP 方法。
- 408 Request Timeout:请求超时,服务器等待客户端发送请求时超时。
- 409 Conflict:请求与服务器的当前状态发生冲突。
- 410 Gone:请求的资源不再可用,且服务器不会再提供。
- 411 Length Required:需要 Content-Length 头部,缺失时无法处理请求。
- 413 Payload Too Large:请求实体过大,无法处理。
- 414 URI Too Long:请求的 URI 太长,服务器无法处理。
- 415 Unsupported Media Type:请求的媒体类型不被支持。
- 429 Too Many Requests:客户端发送的请求次数过多,服务器认为超出了限制。
5. 5xx(服务器错误状态码)
这些状态码表示服务器遇到错误,无法完成请求。
- 500 Internal Server Error:服务器内部错误,无法完成请求。
- 501 Not Implemented:服务器不支持请求的方法。
- 502 Bad Gateway:服务器作为网关或代理时,收到无效响应。
- 503 Service Unavailable:服务器当前无法处理请求,通常是由于过载或维护。
- 504 Gateway Timeout:网关或代理未能及时从上游服务器获取响应。
- 505 HTTP Version Not Supported:服务器不支持请求中所使用的 HTTP 版本。
1. ==
和 equals()
的区别
==
和 equals()
都是用于比较对象的,但是它们的比较方式有所不同,适用于不同的场景。
==
:
-
比较的是引用地址:
==
用于比较两个对象的内存地址,即它比较的是两个对象是否指向同一个内存位置(是否是同一个对象)。 -
对于基本数据类型,
==
比较的是值。
equals()
:
-
比较的是对象的内容:
equals()
用于比较两个对象的内容是否相等。在 Java 中,String
类重写了equals()
方法,比较的是字符串的内容。 -
如果类没有重写
equals()
方法,默认使用Object
类的equals()
方法,实际上和==
一样,比较的是内存地址。
总结:
==
比较对象的内存地址(引用是否相同)。equals()
比较对象的内容(值是否相同)。
String, StringBuilder, StringBuffer 的区别
在 Java 中,String
、StringBuilder
和 StringBuffer
都是用于处理字符串的类,但它们的特点和使用场景有所不同。以下是它们的主要区别:
1. String
-
不可变性(Immutable):
String
是不可变的,一旦创建后,字符串内容不能更改。如果对一个String
对象进行修改(如拼接、替换),会创建一个新的String
对象。- 由于不可变性,
String
对象在多线程环境下是线程安全的,因为它的内容不会被改变。
2. StringBuilder
-
可变性(Mutable):
StringBuilder
是可变的,它允许在原有字符串的基础上进行修改,而不创建新的对象。它的内容可以被改变(如拼接、替换等),但不会生成新的对象。
-
线程安全性:
StringBuilder
不是线程安全的。如果多个线程同时操作同一个StringBuilder
对象,可能会引发线程安全问题
3. StringBuffer
-
可变性(Mutable):
StringBuffer
和StringBuilder
类似,都是可变的,可以对字符串进行修改而不创建新的对象。
-
线程安全性:
StringBuffer
是线程安全的,内部方法通过加锁来保证线程安全。这使得StringBuffer
在多线程环境下可以安全使用。
-
性能:
- 因为线程安全的原因,
StringBuffer
的性能相对较差(比StringBuilder
要低)。如果不涉及多线程,StringBuilder
通常是更优选择。
- 因为线程安全的原因,
什么时候使用抽象类?什么时候使用接口?
在 Java 中,抽象类和接口都可以用于定义类的抽象行为,二者有一些相似性,但使用场景和设计意图有所不同。理解它们的区别有助于在不同的情况下做出更合适的选择。
使用抽象类的场景
1. 需要共享代码实现时
-
抽象类可以包含具体的方法实现,因此它适用于一些子类之间需要共享代码实现的情况。抽象类可以提供一些公共的方法实现,子类可以继承这些实现,或者重写这些方法。
2. 有共同的父类
- 如果多个类之间存在“是一个”的关系,且它们有一些共同的属性和行为,那么可以使用抽象类。在抽象类中定义这些公共属性和方法,子类只需要继承并实现那些特有的行为。
3. 想要限制类的实例化
- 抽象类不能直接实例化,只能通过子类实例化。这种限制用于将某些类定义为模板,强制要求子类提供实现。
使用接口的场景
1. 多重继承(实现多个接口)
-
Java 不支持类的多重继承,但可以实现多个接口。如果你希望一个类能够有多个不相关的行为,接口是非常合适的选择。
Java 异常体系
Java 的异常体系采用类继承的方式组织,其中 Throwable
是异常体系的根类,所有异常类型都继承自它。Java 中的异常分为两大类:Error
和 Exception
,其中 Exception
又可以分为 RuntimeException
和 非运行时异常。
Error
:表示 JVM 无法恢复的错误,通常由系统问题引发,不建议捕获。OutOfMemoryError
:内存不足错误StackOverflowError
:栈溢出错误VirtualMachineError
:虚拟机错误
Exception
:表示程序可以处理的异常。它分为两类:RuntimeException
:运行时异常,是程序中无法预知的异常,通常不需要强制捕获或声明。- 非
RuntimeException
(受检异常):这类异常是编译时异常,通常需要显式捕获或者通过throws
声明。
常见的运行时异常(RuntimeException
)
运行时异常是 Java 异常体系中的一个重要分支,它通常在程序运行过程中发生,不需要显式声明或捕获。这些异常通常是由于程序中的逻辑错误或预料外的情况引发的。
常见的运行时异常包括 NullPointerException
、ArrayIndexOutOfBoundsException
、ArithmeticException
、ClassCastException
等。
相关文章:

1/30每日一题
从输入 URL 到页面展示到底发生了什么? 1. 输入 URL 与浏览器解析 当你在浏览器地址栏输入 URL 并按下回车,浏览器首先会解析这个 URL(统一资源定位符),比如 https://www.example.com。浏览器会解析这个 URL 中的不同…...

vim的多文件操作
[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明:快捷键ctrlshift^,…...

设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法
首先,根据以下各类HQL语句的基本实例和官方文档记录的这些命令语句各种参数设置,得到各种HQL语句的完整实例,然后在Snowflake的官方文档找到它们对应的Snowflake SQL语句,建立起对应的关系表。在这个过程中要注意HQL语句和Snowfla…...

CAPL与外部接口
CAPL与外部接口 目录 CAPL与外部接口1. 引言2. CAPL与C/C++交互2.1 CAPL与C/C++交互简介2.2 CAPL与C/C++交互实现3. CAPL与Python交互3.1 CAPL与Python交互简介3.2 CAPL与Python交互实现4. CAPL与MATLAB交互4.1 CAPL与MATLAB交互简介4.2 CAPL与MATLAB交互实现5. 案例说明5.1 案…...

无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...

实验四 XML
实验四 XML 目的: 1、安装和使用XML的开发环境 2、认识XML的不同类型 3、掌握XML文档的基本语法 4、了解DTD的作用 5、掌握DTD的语法 6、掌握Schema的语法 实验过程: 1、安装XML的编辑器,可以选择以下之一 a)XMLSpy b)VScode,Vs…...

Autosar-Os是怎么运行的?(内存保护)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 以TC397芯片为例,英飞凌芯片集成了MPU模块, MPU模块采用了硬件机…...

题单:冒泡排序1
题目描述 给定 n 个元素的数组(下标从 1 开始计),请使用冒泡排序对其进行排序(升序)。 请输出每一次冒泡过程后数组的状态。 要求:每次从第一个元素开始,将最大的元素冒泡至最后。 输入格式…...

多目标优化策略之一:非支配排序
多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…...

Go学习:字符、字符串需注意的点
Go语言与C/C语言编程有很多相似之处,但是Go语言中在声明一个字符时,数据类型与其他语言声明一个字符数据时有一点不同之处。通常,字符的数据类型为 char,例如 :声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...

Linux文件原生操作
Linux 中一切皆文件,那么 Linux 文件是什么? 在 Linux 中的文件 可以是:传统意义上的有序数据集合,即:文件系统中的物理文件 也可以是:设备,管道,内存。。。(Linux 管理的一切对象…...

解决Oracle SQL语句性能问题(10.5)——常用Hint及语法(7)(其他Hint)
10.5.3. 常用hint 10.5.3.7. 其他Hint 1)cardinality:显式的指示优化器为SQL语句的某个行源指定势。该Hint具体语法如下所示。 SQL> select /*+ cardinality([@qb] [table] card ) */ ...; --注: 1)这里,第一个参数(@qb)为可选参数,指定查询语句块名;第二个参数…...

JavaScript系列(50)--编译器实现详解
JavaScript编译器实现详解 🔨 今天,让我们深入探讨JavaScript编译器的实现。编译器是一个将源代码转换为目标代码的复杂系统,通过理解其工作原理,我们可以更好地理解JavaScript的执行过程。 编译器基础概念 🌟 &…...

大数据相关职位 职业进阶路径
大数据相关职位 & 职业进阶路径 📌 大数据相关职位 & 职业进阶路径 大数据领域涵盖多个方向,包括数据工程、数据分析、数据治理、数据科学等,每个方向的进阶路径有所不同。以下是大数据相关职位的详细解析及其职业进阶关系。 &#…...

基础项目实战——学生管理系统(c++)
目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…...

C++,STL,【目录篇】
文章目录 一、简介二、内容提纲第一部分:STL 概述第二部分:STL 容器第三部分:STL 迭代器第四部分:STL 算法第五部分:STL 函数对象第六部分:STL 高级主题第七部分:STL 实战应用 三、写作风格四、…...

【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.3.1. 函数和方法的隐式解引用转化(Deref Coercion) 隐式解引用转化(Deref Coercion)是为函数和方法提供的一种便捷特性。 它的原理是…...

密码强度验证代码解析:C语言实现与细节剖析
在日常的应用开发中,密码强度验证是保障用户账户安全的重要环节。今天,我们就来深入分析一段用C语言编写的密码强度验证代码,看看它是如何实现对密码强度的多维度检测的。 代码整体结构 这段C语言代码主要实现了对输入密码的一系列规则验证&a…...

arkts bridge使用示例
接上一篇:arkui-x跨平台与android java联合开发-CSDN博客 本篇讲前端arkui如何与后端其他平台进行数据交互,接上一篇,后端os平台为Android java。 arkui-x框架提供了一个独特的机制:bridge。 1、前端接口定义实现 定义一个bri…...

LINUX部署微服务项目步骤
项目简介技术栈 主体技术:SpringCloud,SpringBoot,VUE2, 中间件:RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh,用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…...

zsh安装插件
0 zsh不仅在外观上比较美观,而且其具有强大的插件,如果不使用那就亏大了。 官方插件库 https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins 官方插件库并不一定有所有的插件,比如zsh-autosuggestions插件就不再列表里,下面演示zs…...

网站如何正式上线(运维详解)
因为平台原因,不能有太多链接,所以下文中链接都删除了,想访问的去原文链接:https://www.zhoudongqi.com/ TIPS 这篇文章是我自己运营运维的wordpess站点的经验总结,可以说十分详细,域名,服务器和…...

SQL server 数据库使用整理
标题:SQL server 数据库使用整理 1.字符串表名多次查询 2.读取SQL中Json字段中的值:JSON_VALUE(最新版本支持,属性名大小写敏感) 1.字符串表名多次查询 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…...

【Rust自学】17.2. 使用trait对象来存储不同值的类型
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 17.2.1. 需求 这篇文章以一个例子来介绍如何在Rust中使用trait对象来存储不同值的类型。 …...

初始化mysql报错cannot open shared object file: No such file or directory
报错展示 我在初始化msyql的时候报错:mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读: libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要,因此…...

2025年1月22日(网络编程)
系统信息: ubuntu 16.04LTS Raspberry Pi Zero 2W 系统版本: 2024-10-22-raspios-bullseye-armhf Python 版本:Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习…...

Jason配置环境变量
jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统,请按照以下具体步骤操作 视窗 下载 Jason 的最新版本,选择“jason-bin-3.3.0.zip”…...

蓝桥杯python语言基础(7)——自定义排序和二分查找
目录 一、自定义排序 (一)sorted (二)list.sort 二、二分查找 bisect 一、自定义排序 (一)sorted sorted() 函数会返回一个新的已排序列表,而列表的 sort() 方法会直接在原列表上进行排序…...

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台
1 项目简介(开源地址在文章结尾) 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频,甄别分类、实况分析鸟类保护动物,与全世界各地的用户&…...

后盾人JS--闭包明明白白
延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…...