Python math-parser 完整使用手册
一、math-parser 包基础概述
1. 核心功能
math-parser是一款轻量级数学表达式解析求值库,核心定位:安全解析、动态计算自定义数学字符串表达式,区别于 Python 原生eval():
- 安全隔离:禁止访问系统函数、变量、内置对象,杜绝代码注入风险;
- 支持完整数学语法:四则运算、括号、幂、取模、三角函数、对数、阶乘、最值、条件判断;
- 自定义变量/常量:运行时传入变量字典动态赋值;
- 自定义函数扩展:支持注册自定义数学函数;
- 精度控制:浮点精度、整数模式、科学计数法解析;
- 表达式语法校验:提前捕获括号不匹配、非法运算符、未定义变量等语法错误。
适用场景:计算器工具、表单公式计算、工业参数运算、教育答题系统、报表动态公式。
2. 安装方式
标准 pip 安装
pipinstallmath-parser国内镜像加速
pipinstallmath-parser-ihttps://pypi.tuna.tsinghua.edu.cn/simple版本查看与升级
# 查看版本pip show math-parser# 升级最新版pipinstall--upgrademath-parser验证安装
importmath_parserprint(math_parser.__version__)二、核心语法、内置常量、内置函数与参数
1. 基础运算语法
| 运算符 | 含义 | 示例 |
|---|---|---|
+ - * / | 加减乘除 | 10+5*2 |
^ | 幂运算(替代**) | 2^3 = 8 |
% | 取模(余数) | 7%3 = 1 |
! | 阶乘(后置) | 5! = 120 |
() | 优先级括号 | (1+2)*4 |
-x | 负号 | -10 + 3 |
2. 内置数学常量(无需定义直接使用)
pi 圆周率 3.141592653589793 e 自然常数 2.718281828459045 tau 2*pi inf 无穷大 nan 非数值3. 内置数学函数(单/多参数)
单参数函数
sin, cos, tan, asin, acos, atan, sqrt, log, ln, log10, abs, floor, ceil, round, factorial
多参数函数
min(a,b,c...), max(a,b,c...), pow(base,exp), atan2(y,x)
逻辑条件语法(三元运算)
if(条件, 真值, 假值)
示例:if(x>10, x*2, x/2)
4. 核心API与参数详解
包核心类:MathParser,核心方法evaluate()、parse()
4.1 MathParser 初始化参数
frommath_parserimportMathParser parser=MathParser(allow_undefined=False,# 是否允许未定义变量,False则直接报错precision=15,# 浮点计算精度use_radians=True,# 三角函数默认弧度,False为角度allow_custom_functions=True,# 开启自定义函数注册strict_syntax=True# 严格语法校验,多余括号、连续运算符直接报错)4.2 evaluate() 执行计算(最常用)
# 语法result=parser.evaluate(expression:str,variables:dict=None)expression:待解析数学字符串;variables:变量字典{"x":10, "y":20};- 返回值:int / float;
4.3 parse() 语法预解析(不计算,仅校验语法)
ast=parser.parse("(1+2)*sqrt(pi)")# 返回抽象语法树AST,用于提前校验表达式合法性4.4 自定义函数注册
# 注册自定义二元函数 add(a,b)parser.register_function("add",lambdaa,b:a+b)三、8个完整可运行实际应用案例
案例1:基础四则+常量计算(简易科学计算器)
需求:计算圆面积S=pi*r²,半径r=5
frommath_parserimportMathParser parser=MathParser()expr="pi * r ^ 2"vars_map={"r":5}res=parser.evaluate(expr,variables=vars_map)print(f"圆面积 ={res:.4f}")# 输出:圆面积 = 78.5398案例2:三角函数工程计算(直角三角形斜边)
需求:已知夹角30°、邻边10,求对边tan(θ)*a,切换角度模式
frommath_parserimportMathParser# use_radians=False 使用角度制parser=MathParser(use_radians=False)expr="tan(theta) * a"var={"theta":30,"a":10}res=parser.evaluate(expr,var)print(f"对边长度:{res:.3f}")# 输出:对边长度:5.774案例3:多变量线性公式(财务月供等额本息)
公式:月供 = P * r*(1+r)^n / ((1+r)^n -1)
P贷款本金,r月利率,n期数
frommath_parserimportMathParser parser=MathParser()# 贷款100万,年利率4.2%,分30年(360期)expr="P * r * (1+r)^n / ((1+r)^n - 1)"vars_dict={"P":1000000,"r":0.042/12,"n":360}month_pay=parser.evaluate(expr,vars_dict)print(f"每月月供:{month_pay:.2f}")案例4:条件判断公式(绩效得分分级)
规则:分数s>90得A(100),60<=s<=90得B(80),小于60得C(50)
frommath_parserimportMathParser parser=MathParser()# 嵌套if条件表达式expr="if(s>90, 100, if(s>=60, 80, 50))"print(parser.evaluate(expr,{"s":95}))# 100print(parser.evaluate(expr,{"s":72}))# 80print(parser.evaluate(expr,{"s":45}))# 50案例5:自定义函数扩展(求两数平均值)
需求:内置无avg函数,手动注册avg(a,b)
frommath_parserimportMathParser parser=MathParser()# 注册自定义函数parser.register_function("avg",lambdaa,b:(a+b)/2)# 调用自定义函数res=parser.evaluate("avg(85, 95)")print("平均分:",res)# 90.0案例6:批量表达式批量计算(报表批量求值)
需求:一组不同公式,共用同一批变量批量运算
frommath_parserimportMathParser parser=MathParser()# 统一变量base_vars={"x":10,"y":4}# 多条计算公式列表expr_list=["x + y * 3","sqrt(x) + log10(y)","max(x,y) ^ 2"]forexpinexpr_list:val=parser.evaluate(exp,base_vars)print(f"{exp}={val}")案例7:语法预校验(表单公式输入合法性检测)
需求:用户前端输入公式,提前判断语法是否错误,不执行计算
frommath_parserimportMathParser,ParseError parser=MathParser(strict_syntax=True)defcheck_expression_valid(expr):try:parser.parse(expr)returnTrue,"表达式语法合法"exceptParseErrorase:returnFalse,f"语法错误:{str(e)}"# 测试合法/非法表达式print(check_expression_valid("(x+5)*pi"))print(check_expression_valid("(10+3*"))# 括号缺失报错案例8:阶乘、对数复合运算(统计学组合计算)
组合公式 C(n,k) = n!/(k! * (n-k)!),计算C(10,3)
frommath_parserimportMathParser parser=MathParser()expr="n! / (k! * (n - k)! )"res=parser.evaluate(expr,{"n":10,"k":3})print(f"组合数C(10,3) ={res}")# 120.0四、常见错误分类、报错原因与解决方案
1. ParseError 语法解析错误(最常见)
报错1:括号不匹配Mismatched parentheses
- 原因:左括号多于右括号 / 缺少括号
- 示例表达式:
(10+2*3 - 解决:补全闭合括号
报错2:非法运算符连续Unexpected operator
- 原因:
10++5、3*/2连续运算符 - 解决:修正表达式书写
报错3:非法字符Invalid token
- 原因:表达式包含中文、#、@、字母符号等不支持字符
- 解决:仅使用数字、内置函数、常量、运算符、英文括号
2. EvaluationError 运行求值错误
报错1:Undefined variableVariable 'xx' is not defined
- 原因:表达式使用变量,但未传入variables字典;初始化
allow_undefined=False(默认) - 解决:
- 在variables补充缺失变量;
- 临时放开:
MathParser(allow_undefined=True)(不推荐,容易隐藏bug)
报错2:数学值域错误math domain error
- 场景1:
sqrt(-5)负数开平方; - 场景2:
log(0)对数传入0/负数; - 场景3:
factorial(-3)负数阶乘; - 解决:增加if条件判断过滤非法输入值
报错3:除零division by zero
- 原因:分母表达式计算结果为0
- 解决:前置判断分母,或使用if分支规避分母为0场景
3. 自定义函数注册错误
报错:Unknown function 'avg'
- 原因:未执行register_function就调用自定义函数;函数名拼写不一致
- 解决:先注册再使用,函数名大小写完全匹配
4. 类型转换错误
报错:Cannot cast value to number
- 原因:variables传入字符串、列表、对象等非数字值
- 解决:变量字典value仅使用int/float
五、使用注意事项与最佳实践
1. 安全相关(核心)
- 禁止直接接收不可信用户输入不做校验
math-parser 比 eval 安全,但仍建议搭配parse()预校验过滤超长表达式、恶意超长循环运算; - 不开启
allow_undefined=True生产环境,未定义变量会隐藏业务异常;
2. 性能优化
- 多次计算复用同一个
MathParser实例,不要循环内重复初始化; - 批量计算统一传入variables字典,减少参数传递开销;
- 复杂长表达式优先使用
parse()预编译AST,重复计算直接复用语法树;
3. 三角函数单位坑
- 默认
use_radians=True弧度;几何绘图、工业角度计算务必手动设为False; - 角度转弧度可手动:
theta * pi / 180
4. 精度与浮点数问题
- 浮点运算存在微小误差,金额计算建议放大100倍用整数运算,结果再缩小;
- 初始化
precision按需调整,默认15位足够常规科学计算;
5. 表达式书写规范
- 幂运算统一用
^,不要使用Python原生**,math-parser不识别双星号; - 变量名仅使用英文小写字母,禁止数字开头、中文变量;
- 多参数函数参数用英文逗号分隔,不能加空格以外分隔符;
6. 异常捕获规范
生产环境必须双层捕获:
frommath_parserimportMathParser,ParseError,EvaluationError parser=MathParser()try:res=parser.evaluate(expr,vars)exceptParseErrorase:# 语法错误exceptEvaluationErrorase:# 计算值域、变量、除零错误exceptExceptionase:# 兜底未知异常7. 不支持功能(避坑)
- 不支持数组、列表、矩阵运算;仅标量数值计算;
- 不支持Python内置关键字、循环、if代码块(仅内置if三元函数);
- 不支持复数运算,负数开平方直接抛值域错误;
- 不支持自定义运算符,仅可注册函数。
《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。