cexprtk:Python中的数学表达式解析和计算

1 安装

可以使用 pip 安装:

pip install cexprtk

注意:安装需要安装兼容的 C++ 编译器。

2 用法

1)示例:计算一个简单的方程

计算算术表达式 (5+5) * 23

import cexprtk
cexprtk.evaluate_expression("(5+5) * 23", {}) # 230.0

2)示例:使用变量

通过将字典传递给 evaluate_expression 函数,可以在表达式中使用变量。这会将变量名称映射到其值。可以使用变量值重新计算上一示例中的表达式:

cexprtk.evaluate_expression("(A+B) * C", {"A" : 5, "B" : 5, "C" : 23}) # 230.0

3)示例:重用表达式

使用该 evaluate_expression() 函数时,数学表达式被解析、计算,然后立即丢弃。此示例演示如何重复使用 an Expression 进行多个计算。

  • 将定义一个表达式来计算圆的周长,然后重新使用它来计算几个不同半径的值。
  • 首先创建一个包含变量 r (半径)的 Symbol_Table ,它还可以添加常量,例如 π。
st = cexprtk.Symbol_Table({'r' : 1.0}, add_constants= True)
  • 现在创建了一个实例 Expression ,定义函数:
circumference = cexprtk.Expression('2*pi*r', st)
  • 初始 Symbol_Table r=1 ,只需调用表达式即可计算此半径:
circumference() # 6.283185307179586
  • 现在,使用 Symbol_Table 的 属性 .variables 返回的类似字典的对象将半径更新为 3.0:
st.variables['r'] = 3.0
circumference() # 18.84955592153876

4)示例:定义自定义函数

Python 可以将具有Symbol_Table的函数进行注册,然后在 Expression 中使用。在此示例中,将定义一个自定义函数,该函数在给定范围内生成随机数。

import random
def rnd(low, high):return random.uniform(low,high)# 注册rnd 函数
st = cexprtk.Symbol_Table({})
st.functions["rand"] = rnd

Symbol_Table 的 functions 属性像字典一样被访问。在前面的代码片段中,将创建一个符号表,然后将 rnd 函数分配给 rand 键。此键在 cexprtk 表达式中用作函数的名称。键不能与现有变量、常量或保留函数名称相同。

该 rand 函数现在将在表达式中使用。此表达式选择一个介于 5 和 8 之间的随机数,然后将其乘以 10。后续代码片段显示了Expression的实例化,然后对其进行了几次评估。可能会从表达式中得到与所示不同的数字,这是因为随机数生成器将使用与示例中使用的不同种子进行初始化。

e = cexprtk.Expression("rand(5,8) * 10", st)
e() # 61.4668441077191
e() # 77.13523163246415

5)示例:定义未知符号解析器

可以通过 unknown_symbol_resolver_callback 参数将回调传递给 Expression 构造函数。在表达式解析期间,当遇到不在与 Symbol_Table 关联的变量或常量时,将调用此Expression回调 。

回调可以为导致注册新符号或标记错误条件提供一些逻辑。

以下示例显示了符号解析程序的潜在用途:

  • 表达式包含 f_VARIABLENAME 和 m_VARIABLENAME 形式的变量
  • 实际变量名称前加上前缀 m_ 或 f_ 在(可能表示性别)
  • VARIABLENAME 应用于在字典中查找所需的值
  • 应根据其前缀对 的 VARIABLENAME 字典值进行加权:m_ 变量应乘以 0.8, f_ 变量应乘以 1.1

方案:

  • 首先定义 VARIABLENAME 字典:
variable_values = { 'county_a' : 82, 'county_b' : 76}
  • 现在回调已定义。这需要一个参数 symbol,它给出了在表达式中找到的缺失变量的名称:
 def callback(symbol):# Tokenize the symbol name into prefix and VARIABLENAME components.prefix,variablename = symbol.split("_", 1)# Get the value for this VARIABLENAME from the variable_values dictvalue = variable_values[variablename]# Find the correct weight for the prefixif prefix == 'm':weight = 0.8elif prefix == 'f':weight = 1.1else:# Flag an error condition if prefix not found.errormsg = "Unknown prefix "+ str(prefix)return (False, cexprtk.USRSymbolType.VARIABLE, 0.0, errormsg)# Apply the weight to the value *= weight# Indicate success and return value to cexprtkreturn (True, cexprtk.USRSymbolType.VARIABLE, value, "")
  • 剩下的就是向Expression 实例注册回调并计算表达式。要计算的表达式为:
st = cexprtk.Symbol_Table({})
# (0.8*82) - (1.1*76) = -18
e=cexprtk.Expression("(m_county_a - f_county_b)", st, callback)
e.value() # -18.0

6)示例:包含用于生成多个值的 return 语句的表达式

Exprtk 表达式可以返回多个值,这些结果可以通过该 results() 方法访问。

下面的示例显示了向包含数字的向量添加常量值的结果:

st = cexprtk.Symbol_Table({})
e = cexprtk.Expression("var v[3] := {1,2,3}; return [v+1];", st)
e.value() # nan
e.results() # [[2.0, 3.0, 4.0]]

注意,在调用 results() 该方法之前,必须计算表达式。

通过 results() 访问的值可以包含字符串、向量和实值的混合:

st = cexprtk.Symbol_Table({'c' : 3})
e = cexprtk.Expression("if(c>1){return ['bigger than one', c];} else { return ['not bigger than one',c];};",st)
e.value() # nan
e.results() # ['bigger than one', 3.0]
st.variables['c']=0.5
e.value() # nan
e.results() # ['not bigger than one', 0.5]

参考:https://github.com/mjdrushton/cexprtk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot项目引入swagger

1.引入依赖 创建项目后&#xff0c;在 pom.xml 文件中引入 Swagger3 的相关依赖。回忆一下&#xff0c;我们集成 Swagger2 时&#xff0c;引入的依赖如下&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2&…

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024)

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024) 会议简介 智能计算、大数据应用与信息科学之间存在相互依存、相互促进的关系。智能计算和大数据应用的发展离不开信息科学的支持和推动&#xff0c;而信息科学的发展又需要智能计算和大数据应用的不断拓展和应用。智…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

如何制作exe文件第一步

目录 0.图片链接1.Welcome&#xff08;可跳过&#xff09;2.Project type--作用选择制作jar包的模式3.定义生成exe应用文件命名和输出地址4.配置执行信息4.1配置应用执行显示方式、安装名称、和显示图标4.2是否重定向日志文件&#xff08;根据需要进行选择&#xff09;4.3配置安…

人生建议——别怯

你的每一次胆怯&#xff0c;都是自我能量的“收缩”。 如果一害怕&#xff0c;就找地方躲。 那你永远要忍受恐惧带来的苦果。 成长&#xff0c;其实就是对恐惧的不断突破。 如果你什么都怯懦。 那就只能一直让自己待在角落。 遇到自己能解决的事情。 根本不用害怕。 遇…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…

深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性

在Linux网络虚拟化领域&#xff0c;虚拟以太网设备&#xff08;veth&#xff09;扮演着至关重要的角色&#x1f310;。veth是一种特殊类型的网络设备&#xff0c;它在Linux内核中以成对的形式存在&#xff0c;允许两个网络命名空间之间的通信&#x1f517;。这篇文章将从多个维…

算法(二分查找)

1.给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xf…

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组? 获取当前时间 获取格式化的时间

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组&#xff1f; 获取当前时间 获取格式化的时间 Python3 JSON 数据解析Python3 日期和时间什么是时间元组&#xff1f;获取当前时间获取格式化的时间 Python3 JSON 数据解析 Python3 中可以使用…

SD-WAN企业组网塑造智能网络

云桥通SD-WAN技术正在成为企业网络架构的主流选择&#xff0c;它通过智能管理和控制网络&#xff0c;为客户提供灵活、安全和高效的网络连接&#xff0c;以满足不断增长的业务需求。 云桥通SD-WAN为客户提供的业务能力&#xff1a; A. 提高网络性能 通过智能路由和负载均衡功…

note31:ORA600

感觉我这辈子都不会忘记这个错误码了 起因&#xff1a;某天晚上发现一个表没法插入数据&#xff0c;plsql报错&#xff1a;“表不存在”&#xff0c;试了各种命令&#xff0c;truncate、drop都不行。因为这张表是张不太影响业务的表&#xff0c;而且报错原因问了不少大佬&…

MuJoCo 入门教程(五)Python 绑定

系列文章目录 前言 本笔记本提供了使用本地 Python 绑定的 MuJoCo 物理入门教程。 版权声明 DeepMind Technologies Limited 2022 年版权所有。 根据 Apache License 2.0 版&#xff08;以下简称 "许可协议"&#xff09;授权&#xff1b;除非遵守许可协议&am…

Linux文件打开及创建(3.31)

创建一个file1文件。 运行结果&#xff1a;

DataX 数据库同步部分源码解析

在工作中遇到异构数据库同步的问题,从Oracle数据库同步数据到Postgres&#xff0c;其中的很多数据库表超过百万&#xff0c;并且包含空间字段。经过筛选&#xff0c;选择了开源的DataXDataX Web作为基础框架。DataX 是阿里云的开源产品&#xff0c;大厂的产品值得信赖&#xff…

Vue.js组件精讲 组件的通信2:派发与广播——自行实现dispatch和broadcast方法

上一讲的 provide / inject API 主要解决了跨级组件间的通信问题&#xff0c;不过它的使用场景&#xff0c;主要是子组件获取上级组件的状态&#xff0c;跨级组件间建立了一种主动提供与依赖注入的关系。然后有两种场景它不能很好的解决&#xff1a; 父组件向子组件&#xff0…

transformer上手(2) —— 注意力机制

自从 2017 年 Google 发布《Attention is All You Need》之后&#xff0c;各种基于 Transformer 的模型和方法层出不穷。尤其是 2018 年&#xff0c;OpenAI 发布的 GPT 和 Google 发布的 BERT 模型在几乎所有 NLP 任务上都取得了远超先前最强基准的性能&#xff0c;将 Transfor…

Java多路查找树(含面试大厂题和源码)

多路查找树&#xff08;Multiway Search Tree&#xff09;&#xff0c;也称为B树或B树&#xff0c;是一种自平衡的树形数据结构&#xff0c;用于存储大量数据&#xff0c;通常用于数据库和文件系统中。它允许在查找、插入和删除操作中保持数据的有序性&#xff0c;同时优化了磁…

【蓝桥杯每日一题】4.9网络分析(代码详解版)

终于把清明节假期时自己挖的坑给补上了 题目来源&#xff1a; 2069. 网络分析 - AcWing题库 参考&#xff1a; Bear_king的图解 y总代码解读 思路1&#xff1a; 思考&#xff1a; 题目看着&#xff0c;看到“发送信息后&#xff0c;又会发送到相邻的结点上面”这句话&am…

js通过Object.defineProperty实现数据响应式

目录 数据响应式属性描述符propertyResponsive 依赖收集依赖队列寻找依赖 观察器 派发更新Observer完整代码关于数据响应式关于Object.defineProperty的限制 数据响应式 假设我们现在有这么一个页面 <!DOCTYPE html> <html lang"en"><head><m…

Oracle表空间满清理方案汇总分享

目录 前言思考 一、第一种增加表空间的数据文件数量达到总容量的提升 二、第二种解决方案针对system和sysaux的操作 2.1SYSTEM表空间优化 2.2sysaux表空间回收 2.2.1针对sysaux的表空间爆满还有第二套方案维护 三、第三种解决方案使用alter tablespace resize更改表空间的…