【前端】JavaScript中的柯里化(Currying)详解及实现
文章目录
- 💯前言
- 💯什么是柯里化?
- 💯柯里化的特点
- 💯柯里化的简单示例
- 💯通用的柯里化实现
- 💯柯里化让代码更易读的原因
- 💯柯里化是否总是更易读?
- 💯柯里化的实现思路
- 💯减少 `return` 的场景
- 💯柯里化的实际用途
- 💯柯里化的缺点
- 💯总结
💯前言
- 在 JavaScript 编程中,函数是极为灵活而强大的工具。近年来,函数式编程风格的流行逐渐改变了开发者对代码结构和设计模式的理解。在函数式编程的诸多技术中,柯里化(Currying)占据了一个十分重要的位置。
对于那些希望编写简洁、优雅、可重用代码的开发者来说,柯里化无疑是一个值得深入研究的概念。本文旨在全面阐述柯里化的理论基础、实现方式
、实际应用场景及其潜在的优势与局限性,以期为读者提供系统化的认知。
JavaScript
💯什么是柯里化?
柯里化是一种将接收多个参数的函数转换为一系列只接收单一参数的函数的技术。这种技术在函数式编程中极为常见,其核心思想是将多参数函数拆分为多个一元函数,使得每次调用时仅需处理一个参数,从而逐步构建出完整的结果。通过这样逐层的拆解与组合,柯里化有效地降低了函数的复杂性,并且提高了函数复用的灵活性。
简单来说,假如我们有一个多参数函数 f(a, b, c)
,经过柯里化之后,它会被转换为 f(a)(b)(c)
的形式。这意味着,每次函数调用仅接受一个参数并返回一个新的函数,直到最终所有的参数都被提供并得到结果。这种逐次处理参数的过程不仅是代码层面的优化,更是一种思维方式上的进步。
柯里化不仅是一种函数转换的技术,它更是一种对函数调用逻辑的重新架构和思考方式。通过逐步处理每个参数,柯里化实现了函数的高度灵活性和精细控制。在实际开发中,柯里化常常与高阶函数
结合使用,以实现复杂逻辑的灵活组合,从而构建出更为优雅和可维护的代码架构。其应用场景涵盖了从简单的数学运算到复杂的事件处理,广泛的实践证明了柯里化在函数式编程中的巨大潜力。
💯柯里化的特点
- 逐步传递参数:柯里化的核心在于函数每次只接受一个参数,而不是一次性接受全部参数。这使得函数调用可以逐步进行,有助于简化逻辑和减少出错概率。
- 延迟计算:柯里化允许函数在传入部分参数后不立即执行,而是返回一个新的函数,以便稍后继续接收剩余的参数。这种
延迟计算
机制对提高程序灵活性和响应性极为有利。 - 提高代码复用性:柯里化通过逐步传递参数,可以方便地创建一系列配置相似但略有不同的函数,从而极大地提高了代码复用性。
- 提升代码的可测试性和可维护性:柯里化后的函数往往较小,且专注于处理单一任务。这种单一功能性的函数更容易进行单元测试,也使得代码维护更加简便。
💯柯里化的简单示例
为了更好地理解柯里化,我们来看一个具体的例子。假设我们有一个简单的加法函数:
function add(a, b) {return a + b;
}
这个函数接受两个参数 a
和 b
,直接返回两者的和。如果我们将它柯里化,可以这样做:
function curriedAdd(a) {return function(b) {return a + b;};
}// 调用方式
const addFive = curriedAdd(5); // 返回一个新函数
console.log(addFive(3)); // 输出 8
在这个例子中,curriedAdd
是一个柯里化后的函数,它每次接收一个参数,返回一个新的函数,直到所有参数都被处理完成。通过柯里化,我们可以创建出例如 addFive
这样有特定用途的新函数,使代码变得更加简洁和可复用。
柯里化的这种方式在某些场景下非常有用,例如当你需要生成一系列类似但略有不同的函数时,柯里化可以方便地固定某些参数值,而不必重复编写函数逻辑。这使得代码显得更加优雅,避免了逻辑上的冗余,同时使得代码变得更加模块化。
💯通用的柯里化实现
如果你需要对任意的多参数函数进行柯里化,可以编写一个通用的柯里化函数。下面是一个实现的例子:
function curry(func) {return function curried(...args) {if (args.length >= func.length) {// 如果传入的参数足够,直接调用原始函数return func.apply(this, args);} else {// 否则返回一个函数,等待更多参数return function(...nextArgs) {return curried(...args, ...nextArgs);};}};
}// 示例
function multiply(a, b, c) {return a * b * c;
}const curriedMultiply = curry(multiply);// 调用方式
console.log(curriedMultiply(2)(3)(4)); // 输出 24
console.log(curriedMultiply(2, 3)(4)); // 输出 24
console.log(curriedMultiply(2, 3, 4)); // 输出 24
在这个通用的柯里化函数中,curry(func)
返回一个新的函数 curried
,它会检查当前传递的参数数量是否足够调用原函数 func
。如果参数足够,就调用原函数并返回结果;否则,返回一个新的函数用于接收剩余的参数。
这种通用柯里化实现不仅可以用于简单的加法或者乘法函数,还可以应用于更加复杂的场景,例如事件处理、API 请求等。在这些场景中,柯里化能够有效地分离参数逻辑,使代码结构更具层次性和可读性。
💯柯里化让代码更易读的原因
- 逐步传参,降低复杂度
传统的函数设计往往要求一次性传入所有参数,这对某些场景来说,直接写出所有参数并不是那么直观或易读。例如:
calculate(10, 20, 30);
在这种情况下,开发者需要明确这些参数分别代表什么,这容易导致代码可读性降低。而柯里化后的函数可以逐步传入参数,每一步都非常明确:
calculate(10)(20)(30);
这种方式每次只关注一个参数,使得代码更加清晰,符合逐步解决问题的逻辑,也让每个函数在功能上保持了单一性,从而降低了整体的复杂度。这种形式尤其适用于处理一系列逐步应用的操作,例如数学计算、字符串处理、或分步骤处理的业务逻辑。
- 逻辑分离,提升复用性
柯里化还使得代码的复用性大大增强。通过柯里化后的函数,我们可以生成特定用途的小工具函数。例如:
const add = (a) => (b) => a + b;const addFive = add(5); // 固定 a 为 5
console.log(addFive(10)); // 输出 15
通过柯里化,我们可以轻松地创建具有特定用途的工具函数,这种简化有助于减少代码的重复,提升开发效率,特别是在需要多次调用相似逻辑的场景下。柯里化后的函数往往具备单一职责,便于模块化和单独测试,这种模块化设计使得开发者能够更加专注于每个独立功能模块的实现。
- 更贴近业务逻辑
柯里化可以使代码的调用方式与业务需求更紧密结合。例如,我们可以定义一个用于记录日志的函数:
const log = (level) => (time) => (message) =>console.log(`[${level}] [${time}] ${message}`);const errorLog = log("ERROR");
const nowErrorLog = errorLog(new Date().toISOString());nowErrorLog("Something went wrong!");
在这个例子中,我们逐步设置日志的级别、时间戳,最终传入具体的日志内容。每一步的调用逻辑都非常清晰,这种设计符合人类的思维方式,使得代码的可读性大大增强。
柯里化使得函数调用更加接近自然语言的描述,特别是在需要复杂参数配置的业务逻辑中,可以清晰地表达每个步骤的含义。这样的分步配置方式对于某些高度定制化的功能,诸如日志管理、API 请求设置等,显得尤为高效和灵活。
💯柯里化是否总是更易读?
- 对于简单场景:增加嵌套可能显得多余
对于一些简单的函数,柯里化可能会使代码变得冗长而无益。例如,简单的加法函数直接写成:
function add(a, b) {return a + b;
}
在这种情况下,柯里化的多层嵌套可能显得过于繁琐,不如直接使用普通函数来得更为简洁。在这种情况下,增加额外的嵌套不仅不会带来实质性的好处,还可能使代码更加难以理解。
- 对于复杂场景:柯里化让逻辑更直观
当函数的参数较多,或者需要灵活地部分应用参数时,柯里化可以帮助逐步清晰地拆分逻辑,显著提升代码的可读性和维护性。对于复杂的业务场景,参数的逐步应用能够显著增强代码的可维护性和逻辑清晰度,从而便于团队协作与理解。
💯柯里化的实现思路
假如一个函数有五个参数,柯里化之后,这个函数会被逐层嵌套为四个返回函数,每一层函数依次接收一个参数。例如:
function curriedAdd(a) {return function(b) {return function(c) {return function(d) {return function(e) {return a + b + c + d + e;};};};};
}console.log(curriedAdd(1)(2)(3)(4)(5)); // 输出 15
在这里,每个函数层级都会接收一个参数,直到所有参数都传入完成。这种设计符合柯里化的基本定义,使得每次调用函数时的逻辑都清晰明确。
对于复杂的业务逻辑,通过柯里化,我们可以逐步将一个多参数的问题分解为更小、更简单的部分,使得每一层函数的职责都变得单一且明确,这样的代码更符合“单一职责原则”,有利于代码的复用和单独测试。
💯减少 return
的场景
如果多层嵌套显得过于复杂,可以通过改进的柯里化实现,允许一次性传入多个参数,从而减少显式嵌套:
function curry(func) {return function curried(...args) {if (args.length >= func.length) {return func.apply(this, args);} else {return function(...nextArgs) {return curried(...args, ...nextArgs);};}};
}// 示例
const add = (a, b, c, d, e) => a + b + c + d + e;const curriedAdd = curry(add);console.log(curriedAdd(1, 2)(3)(4, 5)); // 输出 15
console.log(curriedAdd(1)(2)(3, 4, 5)); // 输出 15
这种改进的柯里化方法结合了传统函数和柯里化的优点,让开发者可以灵活选择是逐步传参还是一次性传入多个参数。这样的灵活性在实际开发中尤为重要,因为它让函数的使用更加便捷,适应不同的使用场景。
💯柯里化的实际用途
-
函数复用
- 柯里化允许你生成固定部分参数的新函数,从而极大地提升了函数的复用性。例如:
const log = (level, message) => console.log(`[${level}] ${message}`); const info = log.bind(null, "INFO"); const error = log.bind(null, "ERROR");info("This is an informational message."); error("This is an error message。");
通过预绑定部分参数,我们可以轻松创建一些特定用途的函数,例如
info
和error
,这些函数共享原始的log
逻辑,但具有不同的参数配置。 -
部分应用
- 通过柯里化,你可以生成特定用途的函数。例如:
const fetchWithBaseURL = curry(fetch)("https://api.example.com");fetchWithBaseURL("/users").then(response => response.json()).then(data => console.log(data));
通过柯里化,我们可以创建一个基于特定基 URL 的
fetch
请求函数,使得后续的 API 调用更加简单和清晰,避免了重复代码。 -
事件处理和回调
- 柯里化函数可以提前绑定部分参数,从而减少代码冗余,使代码更加模块化和灵活。例如在事件处理场景中,可以用柯里化将事件和处理逻辑分离:
const addEventListenerCurried = (element) => (event) => (handler) => {element.addEventListener(event, handler); };const button = document.querySelector("#myButton"); const onClick = addEventListenerCurried(button)("click");onClick(() => alert("Button clicked!"));
通过这样的方式,
addEventListenerCurried
将元素、事件类型和处理逻辑分开,使得每一步都非常清晰且容易复用。
💯柯里化的缺点
- 增加嵌套,容易混淆:对于一些初学者来说,多层嵌套的函数写法可能不太容易理解,尤其是嵌套层数较多时。
- 不适用于所有场景:对于简单的函数或不需要逐步传参的场景,柯里化显得
不必要且冗长
。 - 调试复杂度增加:由于柯里化函数返回的是一层层嵌套的函数,调试时可能难以直观地查看所有的调用与参数,这增加了调试的难度。
- 性能开销:在性能敏感的场景下,柯里化可能带来额外的函数调用开销,尤其是在
深度嵌套
的情况下,可能会影响代码的执行效率。
💯总结
柯里化是一种极具威力的函数式编程技术,通过将多参数函数逐步分解为单参数函数,能够有效提升代码的复用性和可读性。在JavaScript
中,柯里化能够帮助开发者更为模块化和清晰地组织代码,特别是当需要部分应用或者分步处理逻辑时,其优势尤为显著。
尽管柯里化并非适用于所有情况,在某些简单场景下可能显得复杂化
,但掌握柯里化的思想能够极大丰富开发者解决问题的方式。当使用柯里化时,关键在于权衡其带来的灵活性与复杂度,根据具体情境选择最适合的代码组织方式。希望本文的详细阐述能够帮助你更好地理解和运用柯里化,提升代码的质量和可维护性。
柯里化不仅是技术上的转变,更是一种思维方式的革新。它使得函数更加灵活且高度可复用,并且让代码逻辑更接近自然语言描述。通过合理应用柯里化,你可以编写更加优雅、扩展性更强且可维护性更高的代码。无论是在前端还是后端开发中,柯里化都为你提供了一种全新的思维范式,帮助你编写出更加简洁、优雅且强大的代码解决方案。
相关文章:
【前端】JavaScript中的柯里化(Currying)详解及实现
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯什么是柯里化?💯柯里化的特点💯柯里化的简单示例💯通用的柯里化实现💯柯里化让代码更易读的原因💯…...
Cyberchef 辅助网络安全运营-数据格式转换
在网络安全的世界中,经常会遇到各种格式的数据,比如二进制,比如说16进制,URL编码,HTML编码,Unicode编码,Base格式的编码。网络安全运营一个明确的目标就是把这些不同的数据格式换成为可读的字符…...
鸿蒙面试 --- 性能优化(精简版)
一、性能优化的三个方面 感知流畅:通过合理运用动画提升用户对应用操作的感知流畅度,同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅(如出现 / 消失转场、导航转场、模态转场、共享元素转场等)&#x…...
qsort函数详解+代码展示
文章目录 概要系列文章目录前言(1) 定义(2) 使用(举例子 上代码)1、定义数组:2、定义比较函数:3、调用 qsort:4、输出结果: (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数,&#x…...
ms-hot29 解码方法
leetcode原题链接: 解码方法 ms-hot目录: ms-hot目录 上一篇:ms-hot28 合并两个有序数组 下一篇:二叉树的中序遍历 题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : "1" -> A "2"…...
【5】STM32·FreeRTOS·临界段保护与调度器挂起
目录 一、临界段代码保护简介 二、临界段代码保护函数介绍 2.1、调用示例 2.2、内部实现 三、任务调度器的挂起和恢复 3.1、调用示例 3.2、内部实现 一、临界段代码保护简介 什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行ÿ…...
daos源码编译
1. 前言 本文详细介绍如何在almalinux8.9上编译daos.2.0.0源码。系统环境如下: daos: 2.0.0 linux os: almalinux 8.9 linux kernel: 4.18.0-513.5.1.el8_9.x86_64之所以选择2.0.0版本,是因为daos从2.0.0开始是一个全新的架构设计&a…...
Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
火山引擎VeDI在AI+BI领域的演进与实践
随着数字化时代的到来,企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台,火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验,也正逐步在AI(人工智能)与BI(商业智能&…...
java获取docker镜像构建日志
在Java中获取Docker镜像的构建日志,你可以使用Docker Engine API。以下是一个使用OkHttp库的示例代码,用于获取构建日志: import okhttp3.*; import java.io.IOException; public class DockerLogsFetcher { private static final St…...
Spring-boot整合Webservice服务端
Spring Boot整合Webservice服务端 本文是基于前辈一顿吃不饱的文章SpringBoot整合WebService(服务端客户端)-CSDN博客,由于工作需要用.NET调用其他系统发布的WebService服务,尝试用java搭建一个WebService服务端测试一下…...
动静分离具体是怎么实现的?
在 Nginx 中实现动静分离是一种常见的优化手段,用于提高网站的性能和可扩展性。以下是 Nginx 动静分离的一些基本概念和配置方法: 1、什么是动静分离: 动静分离是指将网站的静态资源(如图片、CSS、JavaScript 文件)与…...
如何取出.vmdk文件中的数据
前提:我的云服务器到期了,于是我将云服务器导出了.vmdk镜像。本想在vm虚拟机中启动,但是一直报错。很是苦恼。 首先下载DiskGenius这个软件。 点击磁盘-》打开磁盘 打开.vmdk文件 可以看到内部的文件了,可以选择对应文件导出到桌…...
Vue2中 vuex 的使用
1.安装 vuex 安装vuex与vue-router类似,vuex是一个独立存在的插件,如果脚手架初始化没有选 vuex,就需要额外安装。 yarn add vuex3 或者 npm i vuex3 233 Vue2 Vue-Router3 Vuex3 344 Vue3 Vue-Router4 Vuex4 2. 新建 store/index.j…...
Swift 数据类型
Swift 数据类型 Swift 是一种强类型语言,这意味着在 Swift 中声明的每个变量和常量都必须具有明确的类型。Swift 的类型系统旨在帮助开发者编写清晰、安全的代码。本文将详细介绍 Swift 中的基本数据类型,包括整数、浮点数、布尔值、字符和字符串。 整…...
【pyspark学习从入门到精通22】机器学习库_5
训练-验证分割 TrainValidationSplit 模型为了选择最佳模型,会对输入数据集(训练数据集)进行随机分割,分成两个子集:较小的训练子集和验证子集。分割只执行一次。 在这个例子中,我们还将使用 ChiSqSelect…...
Zookeeper3.5.8集群部署
环境说明 准备三台服务器,我这边是虚拟机,分别为:bigdata141、bigdata142、bigdata143 下载安装包 下载链接:Index of /dist/zookeeper/zookeeper-3.5.8 下载完后,上传到其中一台服务器,我这边上传到 b…...
Linux 无图形界面磁盘空间排查与优化实践20241127
Linux 无图形界面磁盘空间排查与优化实践 引言:磁盘空间问题的痛点与挑战 🔍 常见问题 当系统磁盘空间超过 90% 时,不仅可能导致性能下降,还可能让关键操作无法正常完成。这种情况下,如何高效且精准地排查磁盘占用来…...
TCP socket api详解 续
文章目录 守护进程怎么做到?setsid返回值 dev/null字符文件 daemonTCP协议 退出的时候呢? 会话有很多后台任务,bash肯定会退,那后台会话怎么办呢? 理论上也要退的,但实际上关了bash,bash肯定要…...
一道经典的整数划分题——分弹珠
CSDN 博客:一道经典的整数划分题——分弹珠 一、题目描述 这道题目是一道经典的整数划分问题,要求将 (M) 个弹珠分到 (N) 个盘子中,满足以下条件: 允许盘子为空。两种分法被认为相同当且仅当分配的弹珠数量相同(不考…...
浏览器缓存与协商缓存
1. 强缓存(Strong Cache) 定义 强缓存是指在缓存的资源有效期内,浏览器会直接使用缓存中的数据,而不会发起网络请求。也就是说,浏览器会直接从本地缓存读取资源,不会与服务器进行任何交互。 如何控制强缓…...
Maven 如何配置忽略单元测试
在使用 Maven 进行项目构建时,有时您可能希望跳过测试阶段。 这在确保代码更改不影响测试结果或需要快速部署项目的情况下特别有用。 Maven 提供了多种方法来在构建过程中跳过测试。 为什么跳过测试? 加速构建:对于具有大量测试用例的大项…...
哪里能找到好用的动物视频素材 优质网站推荐
想让你的短视频增添些活泼生动的动物元素?无论是搞笑的宠物瞬间,还是野外猛兽的雄姿,这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站,不论你是短视频新手还是老手,都能在这些网站找到心…...
Python中的23种设计模式:详细分类与总结
设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。 一、创建型模式(Creational Patterns) 创建型模式关注对象的创建࿰…...
研0找实习【学nlp】14--BERT理解
以后做项目,一定要多调查,选用不同组合关键词多搜索! BERT论文解读及情感分类实战_bert模型在imdb分类上的准确率已经到达了多少的水平-CSDN博客 【深度学习】-Imdb数据集情感分析之模型对比(4)- CNN-LSTM…...
【AI日记】24.11.27 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容:学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster时间:8 小时心得:在学习别人的 notebook 的时候,碰到不懂的知识点,…...
HCIP——堆叠技术实验配置
目录 一、堆叠的理论知识 二、堆叠技术实验配置 三、总结 一、堆叠的理论知识 1.1堆叠概述: 是指将两台交换机通过堆叠线缆连接在一起,从逻辑上变成一台交换设备,作为一个整体参与数据的转发。 1.2堆叠的基本概念 堆叠系统中所有的单台…...
trtllm 部署新体验
实验清华大模型和trtllm Chatglm3 pip3 install tensorrt_llm -U --pre --extra-index-url https://pypi.nvidia.com 要安装git来下载仓库 使用这个chatglm的例子 安装依赖 用最新的glm3的model 然后开始转换model 官方写错了,这应该是个-,不是_&a…...
部署 DeepSpeed以推理 defog/sqlcoder-70b-alpha 模型
部署 DeepSpeed 以推理 defog/sqlcoder-70b-alpha 这样的 70B 模型是一个复杂的过程,涉及多个关键步骤。下面是详细的步骤,涵盖了从模型加载、内存优化到加速推理的全过程。 1. 准备环境 确保你的环境配置正确,以便能够顺利部署 defog/sqlc…...
node.js基础学习-http模块-创建HTTP服务器、客户端(一)
http模块式Node.js内置的模块,用于创建和管理HTTP服务器。Node.js使用JavaScript实现,因此性能更好。 使用http模块创建服务器,我们建议使用commonjs模块规范,因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…...
Cobalt Strike 4.8 用户指南-第十一节 C2扩展
11.1、概述 Beacon 的 HTTP 指标由 Malleable Command and Control (Malleable C2) 配置文件控制。Malleable C2 配置文件是一个简单的程序,它指定如何转换数据并将其存储在事务中。转换和存储数据的同一程序(向后解释࿰…...
STM32 使用ARM Compiler V6 编译裸机 LWIP协议栈报错的解决方法
在lwip 的cc.h 中使用以下宏定义,来兼容 V5 和 V6编译器 #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION > 6010050) /* ARM Compiler V6 */ #define __CC_ARM /* when use v6 compiler define this */ #endifV6编译的速度确实比V5块了好多倍。 …...
K8S简介、使用教程
以下是关于 Kubernetes(通常缩写为 K8S)的简介和使用教程: 一、Kubernetes 简介 定义与作用 Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发,后捐赠给云原生计算基…...
Scala—Map用法详解
Scala—Map用法详解 在 Scala 中,Map 是一种键值对的集合,其中每个键都是唯一的。Scala 提供了两种类型的 Map:不可变 Map 和可变 Map。 1. 不可变集合(Map) 不可变 Map 是默认的 Map 实现,位于 scala.co…...
2024御网杯信息安全大赛个人赛wp(misc方向)
目录 一.信息安全大赛的通知二、编码转换1. 第一部分2. 第二部分3. 第三部分 三、1.txt四、buletooth 题目附件以及工具链接: 通过网盘分享的文件:御网杯附件 链接: https://pan.baidu.com/s/1LNA6Xz6eZodSV0Io9jGSZg 提取码: jay1 –来自百度网盘超级会…...
DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释
中文版 本文详细介绍 DeepSpeed 配置文件,结合 4 卡 3090 的实际使用场景,重点解释各个参数的含义,并提供应对爆显存的方案。 DeepSpeed 配置文件详解:从基础到实战 DeepSpeed 是用于加速大规模分布式训练的重要工具,…...
AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析
本文 一、引言:技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot? 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…...
QTableWidget使用代理绘制分行显示
在这里插入代码片# 创建主窗口类: 使用 QTableWidget 作为核心控件。 设置表头及行列信息。 自定义代理: 继承 QStyledItemDelegate,实现代理模式。 重写 paint 和 sizeHint 方法,支持多行文本绘制。 设置行高以适应多行显示。 …...
Linux系统之fuser命令的基本使用
Linux系统之fuser命令的基本使用 一、fuser命令介绍二、fuser命令使用帮助2.1 help帮助信息2.1 基本语法①通用选项②文件/设备相关选项③网络相关选项④进程操作选项⑤其他选项 三、fuser命令的基本使用3.1 查找挂载点的进程3.2 查看指定设备进程信息3.3 查找监听特定端口的进…...
解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题
解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题 一、错误原因分析二、解决方法方法一:使用`dos2unix`工具方法二:使用`sed`命令方法三:使用`tr`命令方法四:在文本编辑器中转换方法五:在Windows系统中使用适当的工具三、预防措施四、总结在使…...
【时时三省】(C语言基础)结构体的声明
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 数组是一组相同类型的元素的集合 结构体也是一些值的集合,结构的每…...
群聊前选择患者功能的实现
和普通群聊不同,开启一个图文会话聊天,必须先选择患者、团队、医生。 原来是集成到腾讯IM当中,现在需要单独写一个页面 原来的代码在这里: const handleShow () > {uni.navigateTo({url: /pageB/active-home/active-home})}…...
目标检测,图像分割,超分辨率重建
目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务,它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为:语义分割、实例分割、全景分割。 语义分割(Semantic Segmentation)&…...
关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明
问题1: Bottlerocket AMI 版本问题 之前,后端团队发现在使用 Bottlerocket v1.26.2 AMI 版本时,存在某些问题。经过 Bottlerocket 团队调查,此行为是罕见的 race condition 导致的结果。 我们在环境中重现了此状况,并且关注到由于 kubelet device manager 的启动时间晚于 NVI…...
安全设备-日志审计-网络路由配置
1 网络设置 菜单项‘网络’‘网络设置’子项。进入网卡列表展示页面。点击操作列‘编辑’图标,可编辑对应网卡信息。 图11-1 网卡信息 设备接口的 GE0/1 接口IP:192.168.0.1子网掩码:255.255.255.0 图11-2 配置网卡 1 IP地址2 子网掩码3 主机DNS4 备份DNS 2 通…...
Linux服务器生成SSH 密钥对与 GitLab 仓库进行交互
目录 生成 SSH 密钥对 将公钥添加到 GitLab 测试 SSH 连接 生成 SSH 密钥对 在执行脚本的机器上打开终端,执行以下命令(假设使用默认的 RSA 算法,一路回车使用默认设置即可,也可以根据需要指定其他算法和参数)&…...
react 的路由功能
1. 安装依赖 pnpm add react-router-dom 2. 基本的路由设置(BrowserRouter) 在 main.tsx 入口文件中使用BrowserRouter组件来包裹整个应用。它会监听浏览器的 URL 变化。 import { StrictMode } from "react";import { createRoot } from …...
vscode python code runner执行乱码
打开vscode code runner插件配置,如图所示: 然后在setting.json修改运行python的默认命令: 将原来 替换成 "python":"set PYTHONIOENCODINGutf8 && python", 参考:Vscode——python环境输出中文乱…...
Element UI 打包探索【3】
目录 第九个命令 node build/bin/gen-cssfile gulp build --gulpfile packages/theme-chalk/gulpfile.js cp-cli packages/theme-chalk/lib lib/theme-chalk 至此,dist命令完成。 解释why Element UI 打包探索【1】里面的why Element UI 打包探索【2】里面…...
windows使用docker安装centos7
参考文章:docker容器安装CentOS7.9 需要指出来的步骤 2.5 安装常用工具及ssh服务 由于centos7不维护,需要更换镜像源才能正常使用yum install命令安装 更换镜像源文章:CentOS 7配置yum镜像源 2.9Xshell远程连接docke_centos7.9 文章没有指…...