【Go类库分享】Go expr 通用表达式引擎
【Go类库分享】Go expr 通用表达式引擎
官方教程:https://expr-lang.org/docs/language-definition
官方Github:https://github.com/expr-lang/expr
文章所含代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-expr
一、介绍
Expr表达式引擎是一个针对Go语言设计的动态配置解决方案,它以简单的语法和强大的性能特性著称。Expr表达式引擎的核心是安全、快速和直观,很适合用于处理诸如访问控制、数据过滤和资源管理等场景。在Go语言中应用Expr,可以极大地提升应用程序处理动态规则的能力。不同于其他语言的解释器或脚本引擎,Expr采用了静态类型检查,并且生成字节码来执行,因此它能同时保证性能和安全性。
二、安装
//通过go get直接安装即可
go get github.com/expr-lang/expr
三、使用
基础使用
①运行基本表达式
在下面例子中,表达式2 + 2被编译成能运行的字节码,然后执行这段字节码并输出结果。
同时下面的例子不包含变量,因此也不用传入环境。
package mainimport ("fmt""github.com/expr-lang/expr"
)func main() {// 编译一个基础的加法表达式program, err := expr.Compile(`2 + 2`)if err != nil {panic(err)}// 运行编译后的表达式,并没有传入环境,因为这里不需要使用任何变量output, err := expr.Run(program, nil)if err != nil {panic(err)}// 打印结果fmt.Println(output) // 输出 4
}
②运行变量表达式
下面我们创建一个包含变量的环境,编写使用这些变量的表达式,编译并运行这个表达式。
在下面例子中,环境env包含了变量apple和banana。表达式apple + banana在编译时会从环境中推断apple和banana的类型,并在运行时使用这些变量的值来评估表达式结果。
package mainimport ("fmt""github.com/expr-lang/expr"
)func main() {// 创建一个包含变量的环境env := map[string]interface{}{"apple": 5,"banana": 10,}// 编译一个使用环境中变量的表达式program, err := expr.Compile(`apple + banana`, expr.Env(env))if err != nil {panic(err)}// 运行表达式output, err := expr.Run(program, env)if err != nil {panic(err)}// 打印结果fmt.Println(output) // 输出 15
}
语法介绍
下面主要是介绍 Expr 表达式引擎内置函数的一部分。通过这些功能强大的函数,可以更加灵活和高效地处理数据和逻辑。更详细的函数列表和使用说明查阅官方函数文档。
官方函数文档:https://expr-lang.org/docs/language-definition
①字面量和变量
Expr表达式引擎能够处理常见的数据类型字面量,包括数字、字符串和布尔值。字面量是直接在代码中写出的数据值,比如42、"hello"和true都是字面量
(1)字面量:数字、字符串、布尔值
// (1) 数字
42 // 表示整数 42
3.14 // 表示浮点数 3.14// (2) 字符串
"hello, world" // 双引号包裹的字符串,支持转义字符
`hello, world` // 反引号包裹的字符串,保持字符串格式不变,不支持转义// (3)布尔值
true // 布尔真值
false // 布尔假值
(2)变量:Expr允许在环境中定义变量,然后在表达式中引用这些变量
// (1)表达式定义变量
env := map[string]interface{}{"age": 25,"name": "Alice",
}// (2)表达式中引用变量
age > 18 // 检查age是否大于18
name == "Alice" // 判断name是否等于"Alice"
②运算符
Expr表达式引擎支持多种运算符,包含数学运算符、逻辑运算符、比较运算符及集合运算符等。
- 数学和逻辑运算符
数学运算符包括加(+)、减(-)、乘(*)、除(/)和取模(%)。逻辑运算符包括逻辑与(&&)、逻辑或(||)和逻辑非(!)
2 + 2 // 计算结果为4
7 % 3 // 结果为1
!true // 结果为false
age >= 18 && name == "Alice" // 检查age是否不小于18且name是否等于"Alice"
- 比较运算符
比较运算符有相等(==)、不等(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(>=),用于比较两个值
age == 25 // 检查age是否等于25
age != 18 // 检查age是否不等于18
age > 20 // 检查age是否大于20
- 集合运算符
Expr还提供了一些用于操作集合的运算符,如in用于检查元素是否在集合中,集合可以是数组、切片或字典
"user" in ["user", "admin"] // true,因为"user"在数组中
3 in {1: true, 2: false} // false,因为3不是字典的键
还有一些高级的集合操作函数,比如all、any、one和none,这些函数需要结合匿名函数(lambda)使用:
all(tweets, {.Len <= 240}) // 检查所有tweets的Len字段是否都不超过240
any(tweets, {.Len > 200}) // 检查是否存在tweets的Len字段超过200
- 成员操作符
在Expr表达式语言中,成员操作符允许我们访问Go语言中struct的属性。这个特性让Expr可以直接操作复杂数据结构,非常地灵活实用。
// (1) 定义结构体
type User struct {Name stringAge int
}// (2)访问结构体变量
env := map[string]interface{}{"user": User{Name: "Alice", Age: 25},
}code := `user.Name`program, err := expr.Compile(code, expr.Env(env))
if err != nil {panic(err)
}output, err := expr.Run(program, env)
if err != nil {panic(err)
}fmt.Println(output) // 输出: Alice
在操作结构体变量时,我们通常会需要判断对应字段值是否为空,这时就需要处理nil的情况:
在访问属性时,可能会遇到对象是nil的情况。Expr提供了安全的属性访问,即使在结构体或者嵌套属性为nil的情况下,也不会抛出运行时panic错误。
方法一:使用?.
操作符引用属性,如果对象为nil则返回nil,而不会报错。
author.User?.Name// 等价于下面的表达式
author.User != nil ? author.User.Name : nil
方法二:??
操作符,主要用于nil时,返回默认值
author.User?.Name ?? "Anonymous"// 等价于下面表达式
author.User != nil ? author.User.Name : "Anonymous"
③函数
Expr支持内置函数和自定义函数,使得表达式更加强大和灵活。
- 内置函数:内置函数像len、all、none、any等可以直接在表达式中使用
- all:函数 all 可以用来检验集合中的元素是否全部满足给定的条件。它接受两个参数,第一个参数是集合,第二个参数是条件表达式。
// 检查所有 tweets 的 Content 长度是否小于 240
code := `all(tweets, len(.Content) < 240)`
program, err := expr.Compile(code, expr.Env(env))
if err != nil {panic(err)
}
- any:与 all 类似,any 函数用来检测集合中是否有任一元素满足条件。
// 检查是否有任一 tweet 的 Content 长度大于 240
code := `any(tweets, len(.Content) > 240)`
- none:用于检查集合中没有任何元素满足条件。
// 确保没有 tweets 是重复的
code := `none(tweets, .IsRepeated)`
// 内置函数示例
program, err := expr.Compile(`all(users, {.Age >= 18})`, expr.Env(env))
if err != nil {panic(err)
}// 注意:这里env需要包含users变量,每个用户都需要有Age属性
output, err := expr.Run(program, env)
fmt.Print(output) // 如果env中所有用户年龄都大于等于18,返回true
- 自定义函数:通过在环境映射env中传递函数定义来创建自定义函数
在Expr中使用函数时,我们可以让代码模块化并在表达式中加入复杂逻辑。通过结合变量、运算符和函数。但需要注意,在构建Expr环境并运行表达式时,始终要确保类型安全。
// 自定义函数示例
env := map[string]interface{}{"greet": func(name string) string {return fmt.Sprintf("Hello, %s!", name)},
}program, err := expr.Compile(`greet("World")`, expr.Env(env))
if err != nil {panic(err)
}output, err := expr.Run(program, env)
fmt.Print(output) // 返回 Hello, World!
实际生产案例
比如我们现在有一个需求:电商平台需要根据用户属性(会员等级、地域)和订单信息(金额、商品类目),动态配置促销活动的参与条件和折扣规则,无需修改代码即可更新规则。
package mainimport ("fmt""log""time""github.com/expr-lang/expr""github.com/expr-lang/expr/vm"
)// 用户信息
type User struct {ID intName stringLevel int // 会员等级(1-普通, 2-黄金, 3-钻石)Region string // 用户所在地区JoinTime time.Time
}// 订单信息
type Order struct {OrderID stringAmount float64 // 订单金额Category string // 商品类目(electronics, clothing, food)CreatedTime time.Time
}// 促销规则配置
type PromotionRule struct {Condition string // Expr表达式,判断是否满足条件Discount float64 // 折扣比例(0.9表示9折)
}// 初始化规则引擎环境
func createEnv(user User, order Order) map[string]interface{} {return map[string]interface{}{"User": user,"Order": order,"Now": time.Now(), // 内置当前时间函数// 可添加其他辅助函数,如字符串处理、数学计算等}
}// 编译促销规则条件
func compileRule(rule string) (*vm.Program, error) {return expr.Compile(rule, expr.Env(createEnv(User{}, Order{})))
}// 应用促销规则
func ApplyPromotion(user User, order Order, rule PromotionRule) (bool, float64, error) {// 1. 编译规则(生产环境需缓存编译结果)program, err := compileRule(rule.Condition)if err != nil {return false, 0, fmt.Errorf("规则编译失败: %v", err)}// 2. 创建执行环境env := createEnv(user, order)// 3. 执行规则判断output, err := expr.Run(program, env)if err != nil {return false, 0, fmt.Errorf("规则执行失败: %v", err)}// 4. 类型断言判断结果conditionMet, ok := output.(bool)if !ok {return false, 0, fmt.Errorf("规则必须返回布尔值")}// 5. 返回是否满足条件及折扣return conditionMet, rule.Discount, nil
}func main() {// 模拟用户和订单数据user := User{ID: 1001,Name: "Alice",Level: 3,Region: "CN",JoinTime: time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC),}order := Order{OrderID: "20231020001",Amount: 1500.00,Category: "electronics",CreatedTime: time.Now(),}// 从数据库/配置中心读取促销规则(示例)rules := []PromotionRule{{// 规则1:钻石会员且订单金额>1000,享85折Condition: `User.Level >= 3 && Order.Amount > 1000 && Order.Category == "electronics"`,Discount: 0.85,},{// 规则2:注册超过2年的用户,任意订单享9折Condition: `Now.Sub(User.JoinTime).Hours() > 24*365*2`,Discount: 0.9,},}// 遍历所有规则,应用最优折扣bestDiscount := 1.0 // 默认无折扣for _, rule := range rules {valid, discount, err := ApplyPromotion(user, order, rule)if err != nil {log.Printf("规则应用错误: %v", err)continue}if valid && discount < bestDiscount {bestDiscount = discount}}// 计算最终价格finalPrice := order.Amount * bestDiscountfmt.Printf("原价: ¥%.2f\n", order.Amount)fmt.Printf("适用折扣: %.0f%%\n", (1-bestDiscount)*100)fmt.Printf("最终价格: ¥%.2f\n", finalPrice)
}
运行结果:
适用场景
总结:规则变更频繁且对吞吐要求不高 -> expr表达式,否则就直接上代码
场景特征 | 推荐方案 | 理由 |
---|---|---|
规则每天调整多次 | 表达式引擎 | 避免频繁发版,提升业务敏捷性 |
规则复杂且嵌套业务对象 | 直接代码 | 复杂逻辑更易维护,编译器辅助类型检查 |
需非技术人员配置规则(产品/运营) | 表达式引擎 | 降低技术门槛,释放开发资源 |
性能敏感(如:>10万QPS) | 直接代码 | 避免表达式解析开销影响吞吐量 |
多租户定制规则 | 表达式引擎 | 各租户独立配置,互不影响 |
还是以上面的电商场景为例,让大家感受expr的好处以及使用场景:
场景:电商促销规则判断
需求:根据用户等级、订单金额、商品类目动态调整折扣。
方案一:表达式引擎(expr)
// 规则配置(存储于数据库)
rules := []PromotionRule{{Condition: `User.Level >= 3 && Order.Amount > 1000 && Order.Category == "electronics"`,Discount: 0.85,},
}
// 动态执行
valid, _ := ApplyPromotion(user, order, rule)
优势:
- 运营人员可通过管理后台随时新增/修改规则,无需等待版本发布。
- 支持A/B测试:为不同用户组配置不同规则。
劣势:
- 需额外开发规则管理界面和测试工具。
方案二:直接代码判断
func IsPromotionValid(user User, order Order) bool {return user.Level >= 3 && order.Amount > 1000 && order.Category == "electronics"
}
优势:
- 性能极高,适合每秒数十万次调用的场景。
- 逻辑变更通过代码评审,降低错误风险。
劣势:
- 修改折扣条件需发版,无法快速响应市场活动。
相关文章:
【Go类库分享】Go expr 通用表达式引擎
【Go类库分享】Go expr 通用表达式引擎 官方教程:https://expr-lang.org/docs/language-definition 官方Github:https://github.com/expr-lang/expr 文章所含代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-d…...
线性代数(1)用 excel 计算鸡兔同笼
线性代数excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析 三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆…...
Docker基础知识介绍
Docker基础篇 必须要在Linux环境下才能运行,windows下运行也是安装虚拟机后才能下载安装运行 下载安装 linux 依次执行下边步骤 更新 yum yum update 卸载旧的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \do…...
机器人交社保属于“无稽之谈”?
今晨浏览社交网站,惊奇地看到“给机器人上社保”的网页搜索结果竟然多达“约 3,280,000个”。所以被称为“无稽之谈”和“本质上是利用社保之名收税”就实不为过,而且还会让人读罢笑得喷饭:“连搞笑大王赵本山见了,也定会拱手作揖…...
接口测试和功能测试的区别
接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…...
人工智能中的线性代数基础详解
线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …...
nginx不在默认的yum仓库的解决方法
1、添加 Nginx 官方仓库 epel-release 是 Extra Packages for Enterprise Linux 的仓库,包含了 nginx 等常用软件。 sudo yum install -y epel-release sudo yum install -y nginx 2、手动添加 Nginx 仓库 如果 epel-release 不可用,可以手动添加 Ng…...
IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力
在现代工业生产和物流领域,物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时,常常存在适应性差、抓取不稳定、操作复杂等问题,导致生产流程中频繁出现停机调整,增加了人工干预成…...
【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;
ERROR in ./src/pages/biddingViews/address_add.vue?vue&typestyle&index0&id41672bf3&scopedtrue&langscss& (./node_modules/vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].use[1]!./node_modules/dcloud…...
堆排序:力扣215.数组中的第K个大元素
一、问题描述 在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…...
【网络协议】应用层协议HTTPS
文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…...
网络安全防护总体架构 网络安全防护工作机制
1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能…...
图像处理篇---图像预处理
文章目录 前言一、通用目的1.1 数据标准化目的实现 1.2 噪声抑制目的实现高斯滤波中值滤波双边滤波 1.3 尺寸统一化目的实现 1.4 数据增强目的实现 1.5 特征增强目的实现:边缘检测直方图均衡化锐化 二、分领域预处理2.1 传统机器学习(如SVM、随机森林&am…...
探针泄露(WEB)
##解题思路 题目提示是探针泄露,未及时删除的探针可能造成严重的数据泄露 探针的文件常见命名为tz.php,访问它 对于php相关参数,我们是可以点击的,点击phpinfo访问 跳转后搜索flag,得到flag...
Webpack总结
Webpack是一个前端模块打包工具。它可以将多个模块按照依赖关系进行静态分析,并生成一个或多个打包后的文件。 Webpack的核心概念包括entry(入口)、output(输出)、loader(加载器)和plugin&…...
什么是物理信息神经网络PINN
定义原理 物理信息神经网络(PINN)是一种创新的机器学习方法,将深度学习与物理知识相结合,旨在解决偏微分方程(PDE)相关问题。PINN的核心思想是在神经网络的训练过程中引入物理定律,从而提高模型的泛化能力和预测精度。 PINN的工作原理基于以下关键步骤: 构建神经网络…...
Java面向对象(中)
面向对象(中) 1.继承性 继承性的好处: 减少了代码的冗余,提高了代码的复用性。 便于功能的拓展。 为多态性的使用提供了前期。 格式: class A extends B {} A:子类,派生类,subclass。 B:父类&#x…...
ospf单区域
OSPF单区域是指将整个自治系统(AS)内的所有路由器划分到同一个逻辑区域(Area 0,即骨干区域)中运行的OSPF协议模式。以下是其核心要点: 一、定义与核心特点 区域统一性 所有路由器均属于同一区域&…...
kali之nmap
kali之nmap Nmap(Network Mapper)是 Kali Linux 中最著名的网络扫描工具之一,广泛用于网络发现、端口扫描、服务识别、操作系统检测等任务。它是一个功能强大且灵活的开源工具,适用于渗透测试、网络管理和安全审计。 1. Nmap 的主…...
【Rust基础】排序和分组
排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort,因为f32和f64未实现O…...
HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南
概述 HUAWEI DevEco Studio(以下简称 DevEco Studio)是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台,专为 HarmonyOS 系统上的应用和元服务(以下简称 应用/元服务)提供高效的开发环境。 作为一款专业…...
R 语言科研绘图 --- 密度图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【拒绝算法PUA】LeetCode 2270. 分割数组的方案数
系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…...
k8s 配置两个deployment主机级别互斥部署
在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。 实现步骤 定义 Deployment: 为每个…...
Axure大屏可视化原型模板及素材:数据可视化的高效解决方案
数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏,作为数据展示和交互的直观平台,能够实时呈现关键数据,帮助企业快速做出决策。Axure作为原型设计领域的领先工具,以其丰富的组件库、强大的交互设计能力和…...
AGI大模型(2):GPT:Generative Pre-trained Transformer
1 Generative Pre-trained Transformer 1.1 Generative生成式 GPT中的“生成式”指的是该模型能够根据输入自动生成文本内容,而不仅仅是从已有的文本库中检索答案。 具体来说: 生成(Generative):GPT是一个生成式AI模型,能够根据给定的提示(Prompt)动态生成连贯、…...
Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例
你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求? 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…...
函数调用汇编
目录 一、核心概念 二、函数调用过程(以 x86 cdecl 为例) 三、x86 vs x64 区别 四、示例分析(C代码 → 汇编) 五、常见问题 一、核心概念 调用约定 (Calling Convention) 规定参数传递顺序(如 cdecl 是右到左&…...
LabVIEW 线性拟合
该 LabVIEW 程序实现了 线性拟合(Linear Fit),用于计算给定一组数据点的斜率(Slope)和截距(Intercept),并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…...
在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤
以下是为客户在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤: 硬件准备: 70b 模型对硬件要求较高,确保办公电脑有足够强大的 GPU(例如 NVIDIA A100 等高端 GPU,因为模型规模较大,普通…...
国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)
1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。 EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...
网络安全需要学多久才能入门?
网络安全是一个复杂且不断发展的领域,想要入行该领域,我们需要付出足够多的时间和精力好好学习相关知识,才可以获得一份不错的工作,那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…...
H5端vue3 SSR 项目报错小计
H5端vue3 SSR 项目报错小计 环境 "vue-router": "^4.1.6" "vue": "^3.2.45", "vant": "^3.4.9",报错复现 ①.页面刷新点击 RouterLink 跳转链接, 页面无法跳转 问题排查 ①.去除 van-popup 使用的 teleport“…...
【Node.js入门笔记4---fs 目录操作】
Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir():创建目录。异步,非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在: 2. fs.mkdirSync():用于创建一个新的目录。异步,非阻塞。3.fs.rmd…...
xcode 旧版本、历史版本下载
下载链接:https://developer.apple.com/download/all/ 版本发布日志:https://developer.apple.com/documentation/xcode-release-notes 需要登录开发者账号,搜索下载即可: 再贴一下网友做的版本统计macOS 版本对应的 Xcode 版本&…...
(十一) 人工智能 - Python 教程 - Python元组
更多系列教程,每天更新 更多教程关注:xxxueba.com 星星学霸 1 元组(Tuple) 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 实例 创建元组: thistuple ("apple", "b…...
【计算机视觉】工业表计读数(1)--基于关键点检测的读数识别方案
随着工业自动化和智能制造的发展,对设备状态实时监控和数据采集提出了更高要求。本文提出了一种基于YOLO的工业表计读数识别方法,通过首先利用YOLO进行表计目标检测,提取出单独的表计图像,然后分别对表针和刻度进行关键点检测&…...
Redis--Zset类型
目录 一、引言 二、介绍 三、命令 1.zadd 2.zrange,zrevrange,zrangebyscore 3.zcard,zcount 4.zpopmax,bzpopmax,zpopmin,bzpopmin 5.zrank,zrevrank,zscore 6.zrem,zremrangebyrank&a…...
Java 大视界 -- 基于 Java 的大数据机器学习模型的迁移学习应用与实践(129)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
SpringBoot 第一课(Ⅲ) 配置类注解
目录 一、PropertySource 二、ImportResource ①SpringConfig (Spring框架全注解) ②ImportResource注解实现 三、Bean 四、多配置文件 多Profile文件的使用 文件命名约定: 激活Profile: YAML文件支持多文档块ÿ…...
期望最大化(EM)算法
MLE (最大似然估计)是一种非常有效的参数估计方法,但当分布中有多余参数或数据为截尾或缺失时,其 MLE 的求取是比较困难的。于是 Dempster 等人于 1977 年提出了 EM 算法,其出发点是把求 MLE 的过程分两步走࿱…...
DeepSeek与人工智能:技术演进、架构解析与未来展望
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 1. DeepSeek技术全景解析1.1 DeepSeek技术定位1.2 核心技术组件 2. 人工智能发展路线2.1 技术…...
Keepalived 多主模型与 LVS 高可用
一.Keepalived多主模型 Keepalived多主模型概念 如上图,keepalived主从架构性能损耗较严重,如果业务分类明确,则可以配置keepalived多主模型降低损耗,两台keepalived互为主备,如:订单业务走keepalived1&am…...
AGI大模型(6):提示词模型进阶
1 零样本提示 如今,经过⼤量数据训练并调整指令的LLM能够执⾏零样本任务。 代码如下: from openai import OpenAI from dotenv import load_dotenv load_dotenv() # 初始化 OpenAI 服务。 client = OpenAI()prompt = """ 将⽂本分类为中性、负⾯或正⾯。 ⽂…...
群体智能优化算法-旗鱼优化算法 (Sailfish Optimizer, SFO,含Matlab源代码)
摘要 旗鱼优化算法(Sailfish Optimizer, SFO)是一种模拟旗鱼(Sailfish)和沙丁鱼(Sardine)之间捕食关系的新型元启发式算法。通过在搜索过程中模拟旗鱼对沙丁鱼的捕食行为,以及沙丁鱼群的逃逸与…...
适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:适合企业内训的 AI 工具实操培训教程 在当今数字化时代,人工智能(AI)技术迅速发展,深度融入到各个领域,AIGC(人工智能生成内容)更是成…...
用 Python 进行比特币数据分析:从入门到实战
用 Python 进行比特币数据分析:从入门到实战 前言 比特币,这个“数字黄金”,已经成为全球金融市场不可忽视的存在。无论是短线交易、长期投资,还是链上数据分析,都离不开数据的支撑。而 Python,作为数据分析的瑞士军刀,为我们提供了一整套强大的工具。 本篇文章将带你…...
CT重建笔记(四)——三维重建
人如果不思考不学习,天天刷短视频,跟咸鱼有什么区别? 平行的线积分数据(X射线变换) 平行光束图像重建的理论基础是中心切片定理(二维情形见我的博客https://leslielee.blog.csdn.net/article/details/134…...
蓝桥杯刷题周计划(第三周)
目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目代码题解分析 题目九题目代码题解分析 题目十题目代码题解分析 前言 大家好&#…...
Qt 控件概述 QWdiget 1.1
目录 qrc机制 qrc使用 1.在项目中创建一个 qrc 文件 2.将图片导入到qrc文件中 windowOpacity: cursor 光标 cursor类型 自定义Cursor font tooltip focusPolicy styleSheet qrc机制 之前提到使用相对路径的方法来存放资源,还有一种更好的方式…...