《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符数据类型(bytes 与 str)的差异
引言
本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的总结与延伸。在 Python 编程中,字符串处理是几乎每个开发者都会频繁接触的基础操作。然而,Python 中的 bytes
和 str
两种类型常常让初学者甚至有经验的开发者感到困惑。误用这两种类型可能导致编码错误、数据损坏,甚至程序崩溃。本文不仅总结了书中关于 bytes
和 str
的核心要点,还结合个人理解、实际应用场景和拓展思考,力求帮助读者彻底掌握两者的区别及正确使用方法。
文章将从 bytes
和 str
的本质区别入手,逐步探讨编码与解码的操作、实际场景中的选择,以及常见问题与最佳实践。无论你是想提升代码健壮性,还是希望在文件操作、网络编程中游刃有余,这篇博客都将为你提供系统且实用的指导。
主题分解
小节 1:bytes 和 str 的本质区别
bytes 和 str 在 Python 中到底代表什么?
在 Python 中,bytes
和 str
是两种用于处理字符串数据的核心类型,但它们的本质和用途截然不同。简单来说,bytes
是原始的字节序列,存储的是未经解释的二进制数据;而 str
是 Unicode 字符序列,代表人类可读的文本。这种区别决定了它们在内存中的存储方式和使用场景。
1.1 定义与存储方式
bytes
是一个不可变的字节序列,每个元素是一个 0 到 255 之间的整数,代表一个字节(8 位二进制数据)。例如,b'hello'
是一个 bytes
对象,其底层存储是 ASCII 编码的字节序列 [104, 101, 108, 108, 111]
。相比之下,str
是一个 Unicode 字符序列,每个元素是一个 Unicode 码点(code point),可以表示任何语言的字符,包括中文、表情符号等。例如,'hello'
是一个 str
对象,存储的是 Unicode 字符。
为了直观理解,可以把 bytes
比作“原材料”,就像一堆未经加工的二进制数据;而 str
则是“加工后的产品”,是人类可读的文本。两者之间的转换需要通过编码(encode)和解码(decode)操作完成。
1.2 生活化比喻
想象你在国际快递中寄送一封信。信的内容(str
)是用中文写的,但为了传输,物流公司需要将信件内容转换为二进制数据(bytes
)存储在计算机系统中。接收方收到数据后,需要按照正确的编码格式(例如 UTF-8)将二进制数据重新翻译成中文。如果编码或解码出错,收到的可能是一堆乱码。这种比喻很好地解释了 bytes
和 str
的关系。
1.3 内存表示对比
下图展示了 bytes
和 str
在内存中的差异:
+-------------------+-------------------+
| bytes: b'hello' | str: 'hello' |
+-------------------+-------------------+
| [104, 101, 108, | [U+0068, U+0065, |
| 108, 111] | U+006C, U+006C, |
| (ASCII bytes) | U+006F] |
| | (Unicode points) |
+-------------------+-------------------+
1.4 常见误区
一个常见误区是认为 bytes
和 str
可以直接混用。例如,尝试将 bytes
和 str
拼接会导致 TypeError
。这是因为 Python 3 严格区分了两者,开发者必须显式地进行类型转换。
小节 2:编码与解码的正确使用
如何在 bytes 和 str 之间正确转换?
在 Python 中,bytes
和 str
之间的转换通过 encode
和 decode
方法实现。encode
将 str
转换为 bytes
,而 decode
将 bytes
转换回 str
。正确使用这两者是避免编码错误的关键,尤其是在处理文件、网络数据或多语言文本时。
2.1 编码与解码的基本操作
假设我们有一个字符串 '你好'
,想将其转换为 bytes
:
text = '你好'
encoded = text.encode('utf-8') # 转换为 bytes
print(encoded) # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd'
反过来,将 bytes
转换回 str
:
decoded = encoded.decode('utf-8') # 转换回 str
print(decoded) # 输出: 你好
这里,utf-8
是指定的编码格式,Python 还支持 ascii
、latin-1
等多种编码。
2.2 实际应用案例
在实际开发中,编码和解码操作无处不在。例如,读取一个 UTF-8 编码的文本文件:
with open('data.txt', 'r', encoding='utf-8') as f:content = f.read() # 读取为 str
如果文件是以二进制模式打开,则需要手动解码:
with open('data.txt', 'rb') as f:content = f.read() # 读取为 bytestext = content.decode('utf-8') # 转换为 str
另一个常见场景是网络编程。HTTP 响应通常以 bytes
形式返回,开发者需要根据响应头中的编码信息(如 Content-Type: text/html; charset=utf-8
)进行解码。
2.3 常见误区
一个典型错误是忽略编码类型。例如,假设文件是以 GBK 编码保存的,但开发者错误地使用 UTF-8 解码:
with open('data.txt', 'rb') as f:content = f.read()text = content.decode('utf-8') # 错误:UnicodeDecodeError
这种错误会导致 UnicodeDecodeError
,因为 UTF-8 无法正确解析 GBK 编码的字节序列。解决办法是确保编码一致,或使用 chardet
或 charset-normalizer
库检测文件编码。
2.4 编码与解码流程图
以下是编码与解码的流程:
+----------------+ encode +----------------+
| str (Unicode) | -----------> | bytes (binary) |
| '你好' | | b'\xe4\xbd\xa0 |
| | <----------- | \xe5\xa5\xbd' |
+----------------+ decode +----------------+
小节 3:实际场景中的选择与优化
在什么情况下应该优先使用 bytes 或 str?
在实际开发中,选择 bytes
还是 str
取决于具体场景。bytes
适合处理原始二进制数据,而 str
更适合处理用户界面或文本内容。理解两者的适用场景可以帮助开发者编写更健壮的代码。
3.1 网络编程
在网络编程中,数据通常以字节流形式传输。例如,使用 socket
模块发送数据时,必须将 str
编码为 bytes
:
import sockets = socket.socket()
s.connect(('example.com', 80))
request = 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
s.send(request.encode('ascii')) # 发送 bytes
response = s.recv(1024) # 接收 bytes
print(response.decode('utf-8')) # 转换为 str
这里,encode('ascii')
确保请求头符合 HTTP 协议的要求,而 decode('utf-8')
将响应转换为可读文本。
3.2 文件操作
在文件操作中,文本文件通常以 str
形式处理,而二进制文件(如图片、视频)需要使用 bytes
。例如,读取 PNG 图片:
with open('image.png', 'rb') as f:data = f.read() # bytes
如果错误地以文本模式打开二进制文件,会导致 UnicodeDecodeError
或数据损坏。
3.3 Unicode 处理
对于多语言支持,str
是首选,因为它基于 Unicode,可以处理任何语言的字符。例如,处理中文和英文混合的文本:
text = 'Hello 你好'
print(len(text)) # 输出: 8(字符数)
相比之下,bytes
的长度取决于编码格式:
encoded = text.encode('utf-8')
print(len(encoded)) # 输出: 11(字节数)
3.4 性能优化
在内存敏感的场景下,bytes
可能比 str
更高效,因为它直接存储二进制数据,而 str
需要额外的 Unicode 码点解析。但在需要频繁操作文本的场景下,str
的易用性更高。
小节 4:常见问题与最佳实践
开发者在使用 bytes 和 str 时容易犯哪些错误?
尽管 bytes
和 str
的概念看似简单,但在实际开发中,开发者常常因为忽视细节而犯错。以下是一些常见问题及《Effective Python》推荐的最佳实践。
4.1 常见错误
-
混合使用
bytes
和str
:text = 'hello' data = b'world' result = text + data # TypeError
修复方法:显式转换类型:
result = text + data.decode('ascii')
-
忽略默认编码:
在 Python 中,open
函数的默认编码依赖于系统设置(例如 Windows 可能使用 GBK)。这可能导致跨平台兼容性问题。始终显式指定编码:with open('data.txt', 'r', encoding='utf-8') as f:content = f.read()
-
错误处理乱码:
当解码失败时,开发者可能简单地忽略错误:data = b'\xff\xfe' text = data.decode('utf-8', errors='ignore') # 忽略错误
这种做法可能导致数据丢失。更好的方法是记录错误或使用
latin-1
编码作为后备。
4.2 最佳实践
《Effective Python》建议:
- 始终显式指定编码和解码格式,避免依赖系统默认设置。
- 在函数接口中,优先接受
str
作为输入,内部处理bytes
(必要时进行转换)。 - 使用类型注解明确参数类型:
def process_data(data: str) -> bytes:return data.encode('utf-8')
4.3 代码示例:错误与修复
错误代码:
def read_file(path):with open(path, 'r') as f: # 未指定编码return f.read()
修复后:
def read_file(path: str, encoding: str = 'utf-8') -> str:with open(path, 'r', encoding=encoding) as f:return f.read()
总结
通过对《Effective Python》Item 10 的学习,我们深入理解了 Python 中 bytes
和 str
的本质区别:bytes
是原始二进制数据,适合网络传输和二进制文件处理;str
是 Unicode 文本,适合用户界面和多语言支持。正确使用编码和解码方法,可以避免常见的乱码和类型错误。在实际开发中,开发者需要根据场景选择合适的类型,并遵循显式编码、最小转换等最佳实践。
未来,建议读者深入学习 Unicode 标准和字符编码的历史,了解 Python 2 到 Python 3 的字符串处理变化。此外,可以在实际项目中实践本文提到的方法,例如编写一个支持多语言的文件处理脚本,或开发一个简单的网络爬虫,验证 bytes
和 str
的使用效果。
希望这篇博客能为你提供清晰的指导,让你在 Python 字符串处理中更加自信!后续我会继续分享更多关于《Effective Python》精读笔记系列,参考我的代码库 effective_python_3rd,一起交流成长!
相关文章:
《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符数据类型(bytes 与 str)的差异
引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的总结与延伸。在 Python 编程中,字符串处理是几乎每个开发者都会频繁接触的基础操作。然而,Python 中的…...
windows 强行终止进程,根据端口号
步骤1:以管理员身份启动终端 右键点击开始菜单 → 选择 终端(管理员) 或 Windows PowerShell(管理员)。 步骤2:检测端口占用状态 # 查询指定端口(示例为1806) netst…...
PHP-FPM 调优配置建议
1、动态模式 pm dynamic; 最大子进程数(根据服务器内存调整) pm.max_children 100 //每个PHP-FPM进程大约占用30-50MB内存(ThinkPHP框架本身有一定内存开销)安全值:8GB内存 / 50MB ≈ 160,保守设置为100 ; 启动时创建的进程数&…...
我喜欢的vscode几个插件和主题
主题 Monokaione Monokai Python 语义高光支持 自定义颜色为 self 将 class , def 颜色更改为红色 为装饰器修复奇怪的颜色 适用于魔法功能的椂光 Python One Dark 这个主题只在python中效果最好。 我为我个人使用做了这个主题,但任何人都可以使用它。 插件 1.Pylance Pylanc…...
openharmony 地图开发(高德sdk调用)
1.显示地图 2.利用sdk完成搜索功能,以列表形式展示,并提供定位和寻路按钮 3.利用sdk完成寻路,并显示路线信息和画出路线,路线和信息各自点击后可联动到对方信息显示 4.调用sdk 开始导航 商务合作:...
Kotlin-类和对象
文章目录 类主构造函数次要构造函数总结 对象初始化 类的继承成员函数属性覆盖(重写)智能转换 类的扩展 类 class Student { }这是一个类,表示学生,怎么才能给这个类添加一些属性(姓名,年龄…)呢? 主构造函数 我们需要指定类的构造函数。构造函数也是函数的一种,但是它专门…...
LVS+keepalived实战案例
目录 部署LVS 安装软件 创建VIP 创建保存规则文件 给RS添加规则 验证规则 部署RS端 安装软件 页面内容 添加VIP 配置系统ARP 传输到rs-2 客户端测试 查看规则文件 实现keepalived 编辑配置文件 传输文件给backup 修改backup的配置文件 开启keepalived服务 …...
可视化+智能补全:用Database Tool重塑数据库工作流
一、插件概述 Database Tool是JetBrains系列IDE(IntelliJ IDEA、PyCharm等)内置的数据库管理插件。它提供了从数据库连接到查询优化的全流程支持,让开发者无需离开IDE即可完成数据库相关工作。 核心价值: 统一工作环境…...
【认知思维】沉没成本谬误:为何难以放弃已投入的资源
什么是沉没成本谬误 沉没成本谬误(Sunk Cost Fallacy)是指人们倾向于根据过去已经投入的资源(时间、金钱、精力等)而非未来收益来做决策的一种认知偏差。简单来说,它反映了"我已经投入这么多,不能就这…...
Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法
Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法 在 Linux 系统的安全管理中,入侵防范是至关重要的环节。通过对系统进行安全基线检查,可以有效识别潜在的安全漏洞,并采取相应的修复措施,从而降低被入侵的风险…...
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
题意 需要维护 n n n \times n nn 平面上的整点,每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y),初始都为 0 0 0。 同时给定 n n n 次修改操作,每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…...
目标检测任务常用脚本1——将YOLO格式的数据集转换成VOC格式的数据集
在目标检测任务中,不同框架使用的标注格式各不相同。常见的框架中,YOLO 使用 .txt 文件进行标注,而 PASCAL VOC 则使用 .xml 文件。如果你需要将一个 YOLO 格式的数据集转换为 VOC 格式以便适配其他模型,本文提供了一个结构清晰、…...
2025深圳杯D题法医物证多人身份鉴定问题四万字思路
Word版论文思路和千行Python代码下载:https://www.jdmm.cc/file/2712074/ 引言 法医遗传学中的混合生物样本分析,特别是短串联重复序列(Short Tandem Repeat, STR)分型结果的解读,是现代刑事侦查和身份鉴定领域的核心…...
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析 漫谈图像去雾化的挑战 在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这…...
Focal Loss 原理详解及 PyTorch 代码实现
Focal Loss 原理详解及 PyTorch 代码实现 介绍一、Focal Loss 背景二、代码逐行解析1. 类定义与初始化 三、核心参数作用四、使用示例五、应用场景六、总结 介绍 一、Focal Loss 背景 Focal Loss 是为解决类别不平衡问题设计的损失函数,通过引入 gamma 参数降低易…...
VScode 的插件本地更改后怎么生效
首先 vscode 的插件安装地址为 C:\Users\%USERNAME%\.vscode\extensions 找到你的插件包进行更改 想要打印日志,用下面方法 vscode.window.showErrorMessage(console.log "${name}" exists.); 打印结果 找到插件,点击卸载 然后点击重新启动 …...
这类物种组织heatmap有点东西
如果想知道研究对象(人、小鼠、拟南芥、恒河猴等)某个时候各个器官的fMRI信号强度、炎症程度等指标的差异,gganatogram可以以热图的形式轻松满足你的需求。 数据准备 以男性为例,数据包含四列, 每列详细介绍 org…...
通讯录程序
假设通讯录可以存放100个人的信息(人的信息:姓名、年龄、性别、地址、电话) 功能:1>增加联系人 2>删除指定联系人 3>查找指定联系人信息 4>修改指定联系人信息 5>显示所有联系人信息 6>排序(…...
无需翻墙!3D 优质前端模板分享
开发网站时,无需撰写 HTML、CSS 和 JavaScript 代码,直接调用模板内现成的组件,通过拖拽组合、修改参数,几天内即可完成核心页面开发,开发速度提升高达 70% 以上。让开发者更专注于业务逻辑优化与功能创新,…...
Shinkai开源程序 是一个双击安装 AI 管理器(本地和远程),它允许您使用简单的 UI 在 5 分钟或更短的时间内创建 AI 代理
一、软件介绍 文末提供程序和源码下载 Shinkai 开源应用程序在 Web 浏览器中解锁了一流 LLM (AI) 支持的全部功能/自动化。它允许创建多个代理,每个代理都连接到本地或第三方LLMs(例如 OpenAI GPT),这些…...
vscode不能跳转到同一个工作区的其他文件夹
明白了,你说的“第二种情况”是指: 你先打开的是项目文件夹(比如 MyProject),然后通过 VS Code 的“添加文件夹到工作区”功能,把 ThirdPartyLib 文件夹添加进来。 结果,项目代码里 #include “…...
containerd 之使用 ctr 和 runc 进行底层容器操作与管理
containerd 是目前业界标准的容器运行时,它负责容器生命周期的方方面面,如镜像管理、容器执行、存储和网络等。而 ctr 是 containerd 自带的命令行工具,虽然不如 Docker CLI 用户友好,但它提供了直接与 containerd API 交互的能力…...
IMU 技术概述
IMU(惯性测量单元,Inertial Measurement Unit)是一种通过传感器组合测量物体运动状态和姿态的核心设备,广泛应用于导航、控制、智能设备等领域。以下从原理、组成、应用和发展趋势展开说明: 一、核心定义与本质 IMU …...
talk-centos6之间实现
在 CentOS 6.4 上配置和使用 talk 工具,需要注意系统版本较老,很多配置可能不同于现代系统。我会提供 详细步骤 自动化脚本,帮你在两台 CentOS 6.4 机器上实现局域网聊天。 ⸻ 🧱 一、系统准备 假设你有两台主机: …...
hivesql是什么数据库?
HiveSQL并非指一种独立的数据库,而是指基于Apache Hive的SQL查询语言接口,Hive本身是一个构建在Hadoop生态系统之上的数据仓库基础设施。 以下是对HiveSQL及其相关概念的详细解释: 一、Hive概述 定义: Hive是由Facebook开发&…...
(1)python开发经验
文章目录 1 安装包格式说明2 PySide支持Windows7 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 安装包格式说明 PySide下载地址 进入下载地址后有多种安装包,怎么选择: …...
[论文翻译]PPA: Preference Profiling Attack Against Federated Learning
文章目录 摘要一、介绍1、最先进的攻击方式2、PPA3、贡献 二、背景和相关工作1、联邦学习2、成员推理攻击3、属性推理攻击4、GAN攻击5、联邦学习中的隐私推理攻击 三、PPA1、威胁模型与攻击目标(1)威胁模型(2)攻击目标 2、PPA 概述…...
北三短报文数传终端:筑牢水利防汛“智慧防线”,守护江河安澜
3月15日我国正式入汛,较以往偏早17天。据水利部预警显示,今年我国极端暴雨洪涝事件趋多趋频趋强,叠加台风北上影响内陆的可能性,灾害风险偏高,防汛形势严峻复杂。面对加快推进“三道防线”建设,提升“四预”…...
函数加密(Functional Encryption)简介
1. 引言 函数加密(FE)可以被看作是公钥加密(PKE)的一种推广,它允许对第三方的解密能力进行更细粒度的控制。 在公钥加密中,公钥 p k \mathit{pk} pk 用于将某个值 x x x 加密为密文 c t \mathit{ct} c…...
思维链实现 方式解析
思维链的实现方式 思维链的实现方式除了提示词先后顺序外,还有以下几种: 增加详细的中间步骤提示:通过提供问题解决过程中的详细中间步骤提示,引导模型逐步推导和思考。例如,在解决数学证明题时,提示词可以具体到每一步需要运用的定理、公式以及推理的方向,帮助模型构建…...
深入学习Zookeeper的知识体系
目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...
电商平台一站式安全防护架构设计与落地实践
引言:安全即业务,防御即增长 国际权威机构 Forrester 最新报告指出,2024 年全球电商平台因安全防护不足导致的直接营收损失高达 $180 亿,而采用一体化防护方案的头部企业客户留存率提升 32%。本文基于 10 万 节点防护实战数据&a…...
【Pandas】pandas DataFrame cummin
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
奇妙小博客
import matplotlib.pyplot as plt# 定义顶点坐标 A [0, 0] B [6, 1] C [4, 6] P [4, 3]# 绘制三角形 ABC plt.plot([A[0], B[0], C[0], A[0]], [A[1], B[1], C[1], A[1]], b-, labelTriangle ABC) # 绘制点 P plt.scatter(P[0], P[1], colorr, labelPoint P(4,3))# 标注顶点…...
嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析
贴函数原型: 一 首先配置规则通道序列 其实所有的配置函数都是在对寄存器进行操作,要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂,以下是配置规则通道寄存器的介绍,以ADC_SQR3为例,也就是通道序列1到序列6&…...
Java反射详细介绍
的反射(Reflection)是一种强大的机制,允许程序在运行时动态获取类的信息、操作类的成员(属性、方法、构造器),甚至修改类的行为。它是框架开发(如 Spring、MyBatis)、单元测试工具&a…...
2025年土木建筑与水利工程国际会议(ICCHE 2025)
2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) (一)会议信息 会议简称:ICCHE 2025 大会地点:中国银川 投稿邮箱:icchesub-paper.com 收录检索:提交Ei Compendex,CPCI,C…...
适应性神经树:当深度学习遇上决策树的“生长法则”
1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域,神经网络(NNs)凭借其强大的表示学习能力&…...
IBM BAW(原BPM升级版)使用教程第十四讲
续前篇! 一、流程设计中的编程 在 IBM Business Automation Workflow (BAW) 中,编程部分涵盖了多种技术、工具和策略,帮助用户定制和扩展流程。BAW 主要通过脚本、集成、服务和自定义代码来实现流程的灵活性和定制化。下面将详细讲解 BAW …...
【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow
SDN OpenFlow题型 这题其实,认真看书P196-197的例子也不难理解。我个人认为所谓防自学设计主要就是你没看懂这张图的时候就是天书,你知道怎么读这张图的时候就很简单。不过我相信这个用心一点应该也都是能懂的。 题目 4.66-4.69 4-66 我最大的一个问题…...
【React中函数组件和类组件区别】
在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...
多线程代码案例-1 单例模式
单例模式 单例模式是开发中常见的设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守了设计模式,代码的下限就有了一定的保证。设计模式有很多种,在不同的语言中,也有不同的设计…...
langChain存储文档片段,并进行相似性检索
https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs 这段代码展示了如何使用LangChain框架中的InMemoryVectorStore和OpenAIEmbeddings来存储文档片段,并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释&…...
MQTT协议技术详解:深入理解物联网通信基础
MQTT协议技术详解:深入理解物联网通信基础 1. MQTT协议概述 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息传输协议,专为资源受限设备和低带宽、高延迟或不可靠网络环境设计。作为物联网通信的核心协议之一,MQTT…...
python中的进程锁与线程锁
在Python中,线程和进程使用锁的机制有所不同,需分别通过threading和multiprocessing模块实现。以下是具体用法及注意事项: 一、线程锁(Thread Lock) 基本用法 线程锁用于多线程环境下保护共享资源,防止数据…...
导出导入Excel文件(详解-基于EasyExcel)
前言: 近期由于工作的需要,根据需求需要导出导入Excel模板。于是自学了一下下,在此记录并分享!! EasyExcel: 首先我要在这里非常感谢阿里的大佬们!封装这么好用的Excel相关的API,真…...
仿正点原子驱动BMP280气压传感器实例
文章目录 前言 一、寄存器头文件定义 二、设备树文件中添加节点 三、驱动文件编写 四、编写驱动测试文件并编译测试 总结 前言 本文驱动开发仿照正点原子的iic驱动实现,同时附上bmp280的数据手册,可访问下面的链接: BMP280_Bosch(博世…...
Java 反射机制(Reflection)
一、理论说明 1. 反射的定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Jav…...
每日Prompt:发光线条解剖图
提示词 一幅数字插画,描绘了一个 [SUBJECT],其结构由一组发光、干净且纯净的蓝色线条勾勒而成。画面设定在深色背景之上,以突出 [SUBJECT] 的形态与特征。某个特定部位,如 [PART],通过红色光晕加以强调,以…...
从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt
引言:AI 时代的「语言炼金术」 在人工智能技术突飞猛进的今天,我们正在经历一场堪比工业革命的生产力变革。从聊天机器人到图像生成,从数据分析到自动化写作,AI 模型正在重塑人类与信息交互的方式。而在这一切背后,隐…...