python数学表达式求值器
py-expression-eval的Python项目详细描述
python数学表达式计算器
基于js expression eval,作者matthew crumley(email@matthewcrumley.com,http://silentmatt.com/) https://github.com/silentmatt/js-expression-eval
移植到python并由vera mazhuga修改(ctrl-alt-delete@live.com,http://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()
将表达式转换为字符串。
可用的运算符、常数和函数
Expression | Example | Output |
---|---|---|
+ | ^{ | 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'