《Effective Python》第三章 循环和迭代器——永远不要在迭代容器的同时修改它们
引言
本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》第3章“循环和迭代器”中的 Item 22:“Never Modify Containers While Iterating over Them; Use Copies or Caches Instead(永远不要在迭代容器的同时修改它们;使用副本或缓存代替)”。
Python 的迭代行为常常令人困惑,尤其是在你试图在遍历过程中修改容器时。本书中这一条目深入探讨了字典、集合、列表等容器在迭代期间被修改所引发的问题,并提出了几种实用的解决方案。本文不仅总结了书中的核心观点,还结合我在实际开发中的经验,对这一主题进行了系统性的剖析和延伸思考。
为什么这个话题值得深入?因为在实际项目中,我们经常需要根据当前数据的状态来决定下一步操作,例如过滤、更新、删除某些元素。如果不注意迭代与修改之间的关系,轻则导致程序逻辑错误,重则引发死循环或运行时异常。掌握如何安全地处理这类问题,对于写出健壮、高效的代码至关重要。
一、为何不能边迭代边修改容器?
引导式问题:为什么在遍历一个字典的时候向它添加新键会抛出 RuntimeError?
在 Python 中,字典、集合、列表等容器在迭代时都有一个内部的“迭代器状态”,它维护着当前正在访问的位置信息。当你在遍历过程中修改容器的结构(如添加/删除元素),这个状态就会变得不可预测,从而触发 RuntimeError
或陷入无限循环。
字典与集合的“一致性检查”
字典和集合底层基于哈希表实现,为了保证迭代过程的安全性,Python 在每次迭代开始前都会记录当前容器的版本号(size)。如果在迭代过程中发现版本号变化(即容器大小改变),就会抛出异常:
my_dict = {"red": 1, "blue": 2, "green": 3}
for key in my_dict:if key == "blue":my_dict["yellow"] = 4 # 触发 RuntimeError
这其实是一种防御机制,防止你在不知情的情况下破坏数据结构的一致性。
列表的特殊性
列表的行为略有不同。虽然你可以修改已有元素的值,但如果你在当前索引之前插入元素,会导致迭代器不断前进又回退,从而进入死循环:
my_list = [1, 2, 3]
for number in my_list:print(number)if number == 2:my_list.insert(0, 4) # 死循环!
而追加到末尾是允许的,因为此时迭代器尚未到达新增位置。
实际开发案例:服务崩溃
还是处于初学者期间,我曾在一个后台任务中遇到过类似问题:需要根据数据库查询结果动态更新另一个缓存字典。由于没有使用副本而是直接修改原始字典,最终导致迭代器状态混乱,程序频繁报错并崩溃。修复方法就是按照书中建议,先拷贝键列表再进行迭代。
二、安全修改容器的推荐做法有哪些?
引导式问题:既然不能直接修改,那有没有替代方案可以达到同样的效果?
当然有。书中给出了几个清晰且实用的方法,适用于不同场景。
方法一:迭代副本
这是最简单也是最直观的做法。通过创建容器的副本,在副本上迭代,而在原容器上执行修改:
my_dict = {"red": 1, "blue": 2, "green": 3}
keys_copy = list(my_dict.keys()) # 创建副本
for key in keys_copy:if key == "blue":my_dict["green"] = 4 # 安全修改
这种方式适用于大多数情况,尤其是当容器不是特别大时。即使在嵌套结构中也可以使用深拷贝(copy.deepcopy()
)。
图解流程:
[原始字典] --> 复制键列表 --> 迭代副本 --> 修改原始字典
方法二:暂存修改,统一合并
对于性能敏感的大型容器,复制可能带来额外开销。这时我们可以将所有修改暂存在一个临时容器中,最后统一应用:
my_dict = {"red": 1, "blue": 2, "green": 3}
modifications = {}
for key in my_dict:if key == "blue":modifications["green"] = 4
my_dict.update(modifications) # 合并修改
这种方法的好处是内存效率高,但缺点是修改不会立即生效,后续逻辑无法感知这些变更。
方法三:双重查找 + 缓存
如果你希望在迭代过程中就能感知到待修改的数据,可以在主容器和缓存之间做一次合并判断:
modifications = {}
for key in my_dict:value = my_dict[key]cached = modifications.get(key)if value == 4 or cached == 4:modifications["yellow"] = 5
这样就可以在不中断迭代的前提下,提前知道某个键是否已被标记为修改。
开发建议与误区提醒
-
❌ 误区一:认为只有添加/删除才会出错
虽然只修改值通常不会报错,但如果依赖于其他键的值(比如
value = my_dict["green"]
),而该值在后续又被修改,可能会引入逻辑错误。 -
✅ 最佳实践:始终使用副本或缓存策略
即使你觉得当前逻辑不会出错,也应坚持使用副本或缓存,避免未来扩展时无意中引入 bug。
三、从工程角度看安全性与可维护性
引导式问题:这种看似微小的语言特性,真的会影响整个项目的质量吗?
答案是肯定的。这个问题不仅仅是语言层面的技术细节,更是一个工程实践问题。
可维护性挑战
想象这样一个场景:你写了一段逻辑复杂的迭代+修改代码,几个月后有人接手维护。他并不清楚你当时是如何规避风险的,稍作改动就可能导致灾难性后果。
因此,我们在编码时应该秉持以下原则:
“让代码自解释,而不是靠注释说明危险行为。”
自动化测试的价值
对于这种边界条件复杂、容易出错的逻辑,单元测试和集成测试尤为重要。例如:
def test_modify_dict_with_cache():data = {"a": 1, "b": 2}cache = {}for k in data:if k == "b":cache[k] = 3data.update(cache)assert data["b"] == 3
借助自动化测试工具如 pytest
,我们可以快速验证各种边界情况,确保重构或升级不会破坏原有逻辑。
性能考量与优化
对于非常大的容器,确实要考虑性能影响。这时候可以使用 timeit
微基准测试工具对比不同策略的耗时差异:
$ python -m timeit -s 'd = {i:i for i in range(10000)}' 'list(d.keys())'
通过这样的方式,你可以科学评估是否值得采用“缓存+合并”策略。
四、延伸思考:设计模式与函数式编程思想
引导式问题:能否用更高级的设计模式或函数式思想解决这个问题?
当然可以。实际上,Python 支持多种范式,我们可以借助函数式编程或设计模式来提升代码的抽象层次,从而避免手动管理迭代与修改的复杂度。
使用生成器表达式或 map/filter/reduce
函数式编程鼓励我们以声明式的方式描述变换逻辑,而非命令式地控制迭代过程:
original = {"a": 1, "b": 2, "c": 3}
modified = {k: v * 2 for k, v in original.items()}
这种方式天然避开了迭代与修改的冲突,同时也更具可读性和可组合性。
状态分离设计模式(State Pattern)
如果你的业务逻辑足够复杂,甚至可以考虑使用状态机模式,将“待修改”的状态与“已处理”的状态分离管理:
class Processor:def __init__(self):self.pending = []def process(self, container):for item in container:if condition_met(item):self.pending.append(transform(item))container.extend(self.pending)
这种方式将“处理”与“修改”解耦,提升了模块化程度。
函数副作用最小化原则
在现代软件开发中,我们推崇“纯函数”理念,即函数不应对外部状态造成副作用。回归本文,如果我们把修改逻辑封装成返回新容器的函数,就能从根本上避免这类问题:
def modify_dict(data):return {k: (v * 2 if k == "blue" else v) for k, v in data.items()}new_data = modify_dict(old_data)
总结
本文围绕《Effective Python》第3章 Item 22 展开,深入分析了在迭代容器时修改其内容所带来的潜在风险,并介绍了几种安全的替代方案。通过实际开发案例、流程图辅助理解以及对工程实践和设计模式的延伸讨论,我们看到了这一技术点在真实项目中的重要性。
核心要点回顾:
- 避免在迭代过程中修改容器结构(添加/删除元素)
- 推荐使用副本迭代、暂存修改后合并、函数式转换等方式
- 注意逻辑复杂度带来的维护风险,善用测试和性能评估工具
- 可进一步采用函数式编程或设计模式提升代码质量
结语
学习这一条目让我意识到,很多看似“语言限制”的规则背后,其实是工程思维的体现。优秀的开发者不仅要写出功能正确的代码,更要写出易于维护、不易出错的代码。正如这本书所强调的那样,“写好 Python 不只是语法正确,更是写出让人放心的代码。”
后续我会继续分享更多关于《Effective Python》精读笔记系列,参考我的代码库 effective_python_3rd,一起交流成长!
相关文章:
《Effective Python》第三章 循环和迭代器——永远不要在迭代容器的同时修改它们
引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》第3章“循环和迭代器”中的 Item 22:“Never Modify Containers While Iterating over Them; Use Copies or Caches Instead(永远不要在迭代容器的同时修改它…...
SQLite基础及优化
SQLite 什么是SQLite SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它&#…...
数据库与存储安全
2.1 SQL注入攻防实战(手工注入、自动化工具) 攻击原理与分类 联合查询注入:通过UNION SELECT窃取数据。 UNION SELECT 1,username,password FROM users-- 布尔盲注:利用页面响应差异逐位提取数据。 AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id=1)=a-- 时间…...
vue3/vue2大屏适配
vue3-scale-box 和 vue2-scale-box 可以帮助你在不同 Vue 版本中实现大屏自适应缩放。vue3-scale-box - npmvue3 scale box. Latest version: 0.1.9, last published: 2 years ago. Start using vue3-scale-box in your project by running npm i vue3-scale-box. There is 1 o…...
【数据结构 -- AVL树】用golang实现AVL树
目录 引言定义旋转方式LL型RR型LR型RL型 实现结构获取结点高度平衡因子更新高度左旋右旋插入结点中序遍历 引言 AVL树,基于二叉搜索树通过平衡得到 前面我们知道,通过🔗二叉搜索树可以便捷快速地查找到数据,但是当序列有序时&am…...
matlab慕课学习3.5
于20250520 3.5 用while 语句实现循环结构 3.5.1while语句 多用于循环次数不确定的情况,循环次数确定的时候用for更为方便。 3.5.2break语句和continue语句 break用来跳出循环体,结束整个循环。 continue用来结束本次循环,接着执行下一次…...
【jmeter】base64加密
base64加密 执行的脚本: import java.io.*; import sun.misc.BASE64Encoder; String strvars.get("param") #设置了一个user paramBASE64Encoder encodernew BASE64Encoder() log.info("--------start----------") String resultencoder.encod…...
优化Hadoop性能:如何修改Block块大小
在处理大数据时,Hadoop的性能和资源管理是至关重要的。Hadoop的分布式文件系统(HDFS)将数据切割成多个块(Block),并将这些块分布在集群中的不同节点上。在默认情况下,HDFS的块大小可能并不适合所…...
jmeter转义unicode变成中文
打开jmeter,添加后置处理器到接口请求后,在添加完成后将代码复制进入 (注意:最后执行后需要到“察看结果树”里看,需要自行添加对应的监听器) 按如下添加代码进入上图位置: //如下复制于链接&…...
ALSA 插件是什么? PortAudio 断言失败是什么意思?
下面用更简单的语言和图文形式帮你理解: 1. ALSA 插件是什么?为什么重要? 想象你电脑里的音频系统就像一个厨房,ALSA 是厨房里的厨师,负责做出声音(做菜)和收集声音(收菜࿰…...
计算机科技笔记: 容错计算机设计05 n模冗余系统 双模冗余系统 Duplex Systems
接收测试 测试 (HA服务器的方法) HA系统 一、基本HA结构 当前常用的HA(High Availability)系统结构大体如下: 双机结构:两台主机(可称为主机A和主机B) 两种运行模式: A…...
Translational Psychiatry | 注意缺陷多动障碍儿童延迟厌恶的行为与神经功能特征茗创科技茗创科技
摘要 尽管已有大量研究致力于解析注意缺陷多动障碍(ADHD)中的认知异质性,但对其动机变化(尤其是延迟厌恶)的探索仍相对有限。本研究旨在通过识别ADHD儿童的同质性延迟厌恶特征来理解其动机缺陷,采用体验式延迟贴现任务对43名ADHD儿童和47名对照参与者(经…...
MYSQL备份恢复知识:第四章:备份锁
为了获得备份数据的一致性,需要在数据库中加锁,保证在备份期间没有数据变化。早期版本的MySQL仅支持表级锁,在加锁期间不允许访问数据库,这对生产环境是极大的挑战。因此,在后续版本中引入了实例级锁,使得备…...
寻找最优美做题曲线
题目描述 一个有趣的评测功能,就是系统自动绘制出用户的“做题曲线”。所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第 bi 天 AC 了 ci 道题,并且 bi 严格递增,那么该用户的做…...
DeepSeek-V3 vs GPT-4:技术对比与性能评测
DeepSeek-V3 vs GPT-4:技术对比与性能评测 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 DeepSeek-V3 vs GPT-4:技术对比与性能评测摘要引言技术架构对比1. 模型结构:稠密模型 …...
【Fifty Project - D29】
今日完成记录 TimePlan完成情况7:30 - 9:00大论文修改以及小论文修改√9:00 - 9:30整理近期购置物品项√9:30 - 10:00约了个画稿做个毕业冰箱贴!√10:00 - 11:30Leetcod…...
创建一个使用 GPT-4o 和 SERP 数据的 RAG 聊天机器人
亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据:网络数据平台领航者https://www.bright.cn/?promogithub15?utm_sourceorganic-social-cn&utm_campaigncsdn 本指南将解释如何使用 Python、GPT-4…...
安装PostgresSQL
目录 安装postgressql所需的依赖环境 编译安装 解压源码包 切换目录 --prefix指定安装目录 编译以及安装 配置环境创建用户 创建数据存储目录 更改数据存储目录的归属用户 配置环境变量 登录数据库 Dnf安装 安装postgresql 初始化数据库 登录数据库 postgresql…...
PL/SQL 安装配置与使用
目录 一、安装与配置 (一)下载PLSQL Developer (二)下载并配置免安装Oracle客户端 1. 下载Instantclient_11_2 2. 配置环境 (1)配置电脑的环境变量 (2)配置PLSQL Developer的…...
Oracle RAC ADG备库版本降级方案(19.20 → 19.7)
Oracle RAC ADG备库版本降级方案(19.20 → 19.7) 一、前期准备 1.1环境验证 主库版本:19.7 备库版本:19.20 检查兼容性:确认Oracle 19.20补丁是否支持回滚至19.7 1.2备份与快照 对备库数据库进行全量备份&#…...
SpringBoot-4-Spring Boot项目配置文件和日志配置
文章目录 1 项目全局配置文件1.1 配置示例1.2 配置文件加载顺序2 通过配置文件注入配置项2.1 使用@Value注解注入属性2.2 使用@ConfigurationProperties注入2.3 配置注入的注意事项2.4 配置文件中引用已定义值3 Spring Boot的日志配置3.1 引入日志依赖器3.2 自定义日志格式3.3 …...
mac上安装 Rust 开发环境
1.你可以按照提示在终端中执行以下命令(安全、官方支持): curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意:安装过程中建议选择默认配置(按 1 即可)。 如果遇…...
微软押注“代理式AI网络”:一场重塑软件开发与工作方式的技术革命
在 2025 年 Build 开发者大会上,微软正式发布了其面向“开放代理式网络(Open Agentic Web)”的宏大战略,推出超过 50 项 AI 相关技术更新,涵盖 GitHub、Azure、Windows 和 Microsoft 365 全线产品。这一系列更新的核心…...
鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍
随着物联网和智能设备的普及,多设备间的无缝协作变得越来越重要。鸿蒙(HarmonyOS)作为华为推出的新一代操作系统,其分布式技术为实现多设备流转提供了强大的支持。本文将详细介绍鸿蒙多设备流转的技术原理、实现方式和应用场景。 …...
精益数据分析(71/126):从移情到黏性——创业阶段的关键跨越与数据驱动策略
精益数据分析(71/126):从移情到黏性——创业阶段的关键跨越与数据驱动策略 在创业的旅程中,从需求验证的“移情阶段”过渡到产品黏性构建的“黏性阶段”,是决定创业成败的关键转折。今天,我们结合《精益数…...
21. 自动化测试框架开发之Excel配置文件的测试用例改造
21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...
学习vue3:监听器
目录 一,关于监听的概述 二,手动监听器(watch函数) watch()函数语法 监听基本数据类型 监听对象,对象属性 三,自动监听器(watchEffect函数) watchEffect()函数语法…...
十大排序算法--快速排序
目录 原理 第一步 第二步 代码 递归实现快速排序 原理 分治法核心步骤 选择基准值(Pivot) 从数组中选一个元素作为基准值(如最右侧元素、中间元素或随机元素)。 分区(Partition) 将数组分为两部分…...
基于Docker搭建Harbor私有镜像仓库
Harbor 是 VMware 开源的企业级 Docker 容器镜像仓库,支持镜像存储、访问控制、镜像复制、安全扫描、审计日志等功能,适合企业级私有化部署。 1.前置环境说明 Harbor的部署依赖于Docker和Docker Compose环境。鉴于Docker已在系统中完成安装,…...
CentOS 7上搭建高可用BIND9集群指南
在 CentOS 7 上搭建一个高可用的 BIND9 集群通常涉及以下几种关键技术和策略的组合:主从复制 (Master-Slave Replication)、负载均衡 (Load Balancing) 以及可能的浮动 IP (Floating IP) 或 Anycast。 我们将主要关注主从复制和负载均衡的实现,这是构成高…...
使用SQLite Studio导出/导入SQL修复损坏的数据库
使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏,在软件中寸步难行,遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具,支持Windows/macOS/Linux。相较于其…...
Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制
柔性应变传感器通过模拟生物系统反馈机制,为软体机器人提供高精度动作控制能力。研究显示,基于液态导电金属的柔性传感纤维可精准测量仿生手指触觉力(约 1600 kPa)和关节角度变化(约 60),实现特…...
Java IO流操作
Java IO流操作是处理文件和数据流的基础。通过FileInputStream和FileOutputStream,可以读写二进制文件;通过FileReader和FileWriter,可以处理文本文件。BufferedReader提高字符读取效率,InputStreamReader实现字节流到字符流的转换…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3)
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3) 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)受身形(1)两要素时,使用【に】(2)三要素时,使用【を】或其他(3)(4)(5) によって(6)から VS で(2)復習(ふくしゅう):3、单词(…...
BPMN.js编辑器设计器与属性面板数据交互
以下是基于提供的Vue组件代码生成的类图,结合BPMN设计器特性与Vue组件封装规范绘制: #mermaid-svg-B6PK7fjqLLTHqh8B {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-B6PK7fjqLLTHqh8B .error…...
os agent智能体软件 - 第三弹 - 纯语音交互
前两期期我们发布了产品的初级形态,那时候还只能是“软件开发者”在本地配置使用,或者运行起来有个大黑框,使用起来美观度太差。 到今天大概20天,我们的第3版已经出来了,不仅做成了电脑端的exe软件(任何人…...
PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理、 目录 前言 1.二极管 1.发光…...
python打卡训练营打卡记录day31
知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业:尝试针对之前的心脏病项目ipynb,将他按照今天的示例项目整理成规范的形式,思考下哪些部分可以未来复用。 心脏病项目目录 目录结构:heart/ ├── conf…...
Python列表推导式和生成器表达式详解
Python列表推导式和生成器表达式详解 引言 Python以其简洁优雅的语法而闻名,其中列表推导式(List Comprehensions)和生成器表达式(Generator Expressions)就是这种优雅性的典型代表。本文将深入浅出地介绍这两种强大的…...
Redis 命令大全
Redis 是一个开源的内存数据结构存储系统,支持多种数据结构。以下是 Redis 的常用命令分类总结: 一、Key(键)相关命令 命令描述示例DEL key删除键DEL nameEXISTS key检查键是否存在EXISTS nameEXPIRE key seconds设置键的过期时间(秒)EXPIRE name 60TTL key查看键剩余过期…...
Wan2.1 图生视频 支持批量生成
Wan2.1 图生视频 支持批量生成 flyfish 综合效果 实现基于 Wan2.1 模型的配置化批量生成功能,支持从prompt.json读取多个 “图像 - 文本提示” 组合(每个任务可关联多图像),通过config.json集中管理模型路径、分辨率、帧数、引…...
Git 删除大文件教程
🧹 Git 删除大文件完整教程 🧩 适用场景 不小心将大文件(如视频、压缩包、模型文件等)提交到了 Git 仓库想彻底从仓库和提交历史中删除这个文件希望远程仓库体积减小(如 GitHub 上传失败) 🛠️…...
题海拾贝:P2285 [HNOI2004] 打鼹鼠
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 1、题目 P2285 [HNOI2004] 打…...
第40天-Python开发音乐播放器完整指南
一、技术选型与工具准备 核心库: Pyqt5:Python标准GUI库,构建用户界面 os / sys:文件系统操作 开发环境: bash 复制 下载 pip install pyqt5 二、功能设计 功能模块描述播放控制播放/暂停/停止/上一曲/下一曲播放列表管理添加/删除/保存/加载歌曲音频可视化进度条显示与拖…...
【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
在 Quill 日志库中,safe_fwrite 函数的封装是为了解决直接使用系统 fwrite 时可能存在的 可靠性 和 错误处理 问题,同时兼顾性能优化。以下从多个维度详细分析其设计动机和实现原理: 一、代码功能解析 QUILL_ATTRIBUTE_HOT static void safe_fwrite(void const* ptr, size_…...
UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误
自己写的插件打包出现了Unhandled exception: System.ArgumentNullException: Value cannot be null.的错误,发现只有UE5.3会报出。 D:\UE_5.3\Engine\Build\BatchFiles>Runuat.bat BuildPlugin -PluginF:\UEProjects\DQSDK5_3\Plugins\DQSDK\DQSDK.uplugin -Pa…...
JDBC在Java项目开发中的核心作用与实战应用
一、JDBC概述及其在项目开发中的重要性 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口(API),它为Java开发者提供了与各种关系型数据库进行交互的统一方式。 JDBC的核心价值: 提供与数据库无关的标准接…...
为 Jenkins添加 Windows Slave远程执行 python项目脚本
测试环境 JAVA JDK 1.7.0_13 (jdk-7u13-windows-i586.exe) Jenkins Win11 64 python项目环境 实践操作 1、新建与配置结点 【系统管理】-> 【管理结点】-> 【新建结点】, 如上,输入结点名称,勾选 【Dumb Slave】,点击【OK】 说明&am…...
深入解析Spring Boot与Redis的缓存集成实践
深入解析Spring Boot与Redis的缓存集成实践 引言 在现代Web应用中,缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库,广泛应用于缓存场景。本文将详细介绍如何在Spring Boot项目中集成Redis,并探讨其在实际开发中的…...
硬件工程师笔记——三极管Multisim电路仿真实验汇总
目录 1 三极管基础 更多电子器件基础知识汇总链接 1.1 工作原理 NPN型三极管的工作原理 PNP型三极管的工作原理 1.2 三极管的特性曲线 输入特性曲线 理想和现实输出特性 三极管的主要参数包括: 2 三极管伏安特性 2.1 伏安特性仿真 Multisim使用说明链接…...