python数学表达式求值器

py-expression-eval的Python项目详细描述


python数学表达式计算器

Build Status

PyPi versionPyPi downloads

Coverage Status

基于js expression eval,作者matthew crumley(email@matthewcrumley.comhttp://silentmatt.com/https://github.com/silentmatt/js-expression-eval

移植到python并由vera mazhuga修改(ctrl-alt-delete@live.comhttp://vero4ka.info/

您可以随意使用和修改这些代码,无论您觉得有什么用处。请在代码中留下此注释 以确认其原始来源。如果你喜欢的话,我喜欢听关于使用我的代码的项目, 但你不必让我知道或请求许可。

安装

pip install py_expression_eval

测试

python setup.py test

文档

所有py-expression-eval的类和方法都尽可能地与js-expression-eval中的类似类相似,以便于在后端进行验证。

分析器

Parser是库的主要类,包含解析、计算和简化数学表达式的方法。要使用库,您需要创建此类的实例:

>frompy_expression_evalimportParser>parser=Parser()

一旦实例化了Parser类,就可以使用parse方法创建Expression对象:

>parser.parse('2 * 3')Out:<py_expression_eval.Expressioninstanceat0x7f40cc4e5ef0>

解析器.表达式

evaluate()接受一个以变量为参数的字典,并返回表达式的值:

>parser.parse('2 * 3').evaluate({})Out:6>parser.parse('2 * 3.0').evaluate({})Out:6.0>parser.parse('2 * x').evaluate({'x':7})Out:14>parser.parse('2 * x').evaluate({'x':7.0})Out:14.0

substitute()创建一个新表达式,其中指定的变量将替换为一个新表达式。例如,要用2 * x表达式中的3 + x替换x,我们使用以下代码:

>parser.parse('2 * x').substitute('x','3 + x').toString()Out:'(2*(3+x))'

variables()返回表达式的变量列表:

>parser.parse('2 * x + y').variables()Out:['x','y']

simplify()简化了表达式。例如,

>parser.parse('2 * 3 * x + y').simplify({}).toString()Out:'((6*x)+y)'>parser.parse('2 * 3 * x + y').simplify({'x':-1}).toString()Out:'(-6+y)'>parser.parse('cos(PI) + x').simplify({}).toString()Out:'(-1.0+x)'

toString()将表达式转换为字符串。

可用的运算符、常数和函数

ExpressionExampleOutput
+^{}4
-^{}2
^{}^{}6
/^{}2.5
%^{}1
^^{}25.0
PI^{}3.141592653589793
E^{}2.718281828459045
sin(x)^{}0.0
cos(x)^{}- 1.0
tan(x)^{}0.0
asin(x)^{}0.0
acos(x)^{}3.141592653589793
atan(x)^{}1.2626272556789118
log(x)^{}0.0
log(x, base)^{}4.0
abs(x)^{}1
ceil(x)^{}3.0
floor(x)^{}2.0
round(x)^{}3.0
exp(x)^{}7.38905609893065

示例

frompy_expression_evalimportParserparser=Parser()parser.parse('2 * 3').evaluate({})# 6parser.parse('2 ^ x').evaluate({'x':3})# 8.0parser.parse('2 * x + 1').evaluate({'x':3})# 7parser.parse('2 + 3 * x').evaluate({'x':4})# 14parser.parse('(2 + 3) * x').evaluate({'x':4})# 20parser.parse('2-3^x').evaluate({'x':4})# -79.0parser.parse('-2-3^x').evaluate({'x':4})# -83.0parser.parse('-3^x').evaluate({'x':4})# -81.0parser.parse('(-3)^x').evaluate({'x':4})# 81.0parser.parse('2*x + y').evaluate({'x':4,'y':1})# 9parser.parse('round(log(2.7))').evaluate({})# 1.0# substituteexpr=parser.parse('2 * x + 1')expr2=expr.substitute('x','4 * x')# ((2*(4*x))+1)expr2.evaluate({'x':3})# 25# simplifyexpr=parser.parse('x * (y * atan(1))').simplify({'y':4})expr.toString()# x*3.141592expr.evaluate({'x':2})# 6.283185307179586# get variablesexpr=parser.parse('x * (y * atan(1))')expr.variables()# ['x', 'y']expr.simplify({'y':4}).variables()# ['x']

可用操作

frompy_expression_evalimportParserparser=Parser()parser.parse('2 + 3').evaluate({})# 5parser.parse('2 - 3').evaluate({})# -1parser.parse('2 * 3').evaluate({})# 6parser.parse('2 / 3').evaluate({})# 0.6666666666666666parser.parse('2 % 3').evaluate({})# 2parser.parse('-2').evaluate({})# -2parser.parse('abs(-2)').evaluate({})# 2parser.parse('ceil(1.4)').evaluate({})# 2.0parser.parse('floor(1.4)').evaluate({})# 1.0parser.parse('round(1.4)').evaluate({})# 1.0parser.parse('2^3').evaluate({})# 8.0parser.parse('sqrt(16)').evaluate({})# 4.0parser.parse('sin(3.14)').evaluate({})# 0.0015926529164868282parser.parse('cos(3.14)').evaluate({})# -0.9999987317275395parser.parse('tan(3.14)').evaluate({})# -0.0015926549364072232parser.parse('asin(1)').evaluate({})# 1.5707963267948966parser.parse('acos(1)').evaluate({})# 0.0parser.parse('atan(1)').evaluate({})# 0.7853981633974483parser.parse('log(2.7)').evaluate({})# 0.9932517730102834parser.parse('exp(1)').evaluate({})# 2.718281828459045parser.parse('log(E)').evaluate({})# 1.0parser.parse('cos(PI)').evaluate({})# -1.0parser.parse('x||y').evaluate({'x':2,'y':3})# '23'

将包上载到PYPI

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java转换/分组列表中的值   java无法解析安卓中来自其他类的方法调用?   基于java Socket的通信独立于用于实现它的编程语言。怎么可能?   支持GZip的java编写游戏文件存储?   在IntelliJ中测试应用程序的java设置类路径   java反转单链表   java登录Firebase时出现了什么问题   java如何创建基于Spring4注释的通道?   java将2d矩阵向右旋转   socketTomcat WebSocket和单独的java进程通信   curl无法将数据发布到服务器,获取错误java。木卫一。IOException:服务器返回HTTP响应代码:415   java使用空对象模式消除空对象   java使用<String,Boolean>加载缓存的正确用法?   java为什么是CertificateFactory方法。generateCertifictae(InputStream)卡在无限循环上?