Python数学表达式计算器
项目描述
Python数学表达式计算器
基于js-expression-eval,由Matthew Crumley编写(email@matthewcrumley.com,http://silentmatt.com/)https://github.com/silentmatt/js-expression-eval
由@cansadadeserfeliz移植并修改。
您可以根据自己的需求自由使用和修改此代码。请保留此注释以承认其原始来源。如果您愿意,我喜欢了解使用我代码的项目,但您不必通知我或请求许可。
安装
pip install py_expression_eval
测试
python setup.py test
文档
py-expression-eval的所有类和方法都尽可能地与js-expression-eval中的类似项相同,以便在后端进行验证时更容易使用。
解析器
Parser
是库的主要类,其中包含解析、评估和简化数学表达式的函数。要使用此库,您需要创建此类的实例
> from py_expression_eval import Parser
> parser = Parser()
一旦实例化了Parser
类,您就可以使用parse
方法创建Expression
对象
> parser.parse('2 * 3')
Out: <py_expression_eval.Expression instance at 0x7f40cc4e5ef0>
Parser.Expression
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
表达式中的 x
替换为 3 + 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()
函数将表达式转换为字符串。
支持的运算符、常量和函数
表达式 | 示例 | 输出 |
---|---|---|
+ | parser.parse('2 + 2').evaluate({}) |
4 |
- | parser.parse('3 - 1').evaluate({}) |
2 |
* |
parser.parse('2 * 3').evaluate({}) |
6 |
/ | parser.parse('5 / 2').evaluate({}) |
2.5 |
% | parser.parse('5 % 2').evaluate({}) |
1 |
^ | parser.parse('5 ^ 2').evaluate({}) |
25.0 |
PI | parser.parse('PI').evaluate({}) |
3.141592653589793 |
E | parser.parse('E').evaluate({}) |
2.718281828459045 |
sin(x) | parser.parse('sin(0)').evaluate({}) |
0.0 |
cos(x) | parser.parse('cos(PI)').evaluate({}) |
- 1.0 |
tan(x) | parser.parse('tan(0)').evaluate({}) |
0.0 |
asin(x) | parser.parse('asin(0)').evaluate({}) |
0.0 |
acos(x) | parser.parse('acos(-1)').evaluate({}) |
3.141592653589793 |
atan(x) | parser.parse('atan(PI)').evaluate({}) |
1.2626272556789118 |
log(x) | parser.parse('log(1)').evaluate({}) |
0.0 |
log(x, base) | parser.parse('log(16, 2)').evaluate({}) |
4.0 |
abs(x) | parser.parse('abs(-1)').evaluate({}) |
1 |
ceil(x) | parser.parse('ceil(2.7)').evaluate({}) |
3.0 |
floor(x) | parser.parse('floor(2.7)').evaluate({}) |
2.0 |
round(x) | parser.parse('round(2.7)').evaluate({}) |
3.0 |
exp(x) | parser.parse('exp(2)').evaluate({}) |
7.38905609893065 |
and | parser.parse('a and b').evaluate({'a':True, 'b':True}) |
True |
or | parser.parse('a or b').evaluate({'a':True, 'b':True}) |
True |
xor | parser.parse('a xor b').evaluate({'a':True, 'b':True}) |
False |
not | parser.parse('a and not b').evaluate({'a':True, 'b':True}) |
False |
in | parser.parse('1 in (1,2,3)').evaluate({}) |
True |
示例
from py_expression_eval import Parser
parser = Parser()
parser.parse('2 * 3').evaluate({}) # 6
parser.parse('2 ^ x').evaluate({'x': 3}) # 8.0
parser.parse('2 * x + 1').evaluate({'x': 3}) # 7
parser.parse('2 + 3 * x').evaluate({'x': 4}) # 14
parser.parse('(2 + 3) * x').evaluate({'x': 4}) # 20
parser.parse('2-3^x').evaluate({'x': 4}) # -79.0
parser.parse('-2-3^x').evaluate({'x': 4}) # -83.0
parser.parse('-3^x').evaluate({'x': 4}) # -81.0
parser.parse('(-3)^x').evaluate({'x': 4}) # 81.0
parser.parse('2*x + y').evaluate({'x': 4, 'y': 1}) # 9
parser.parse('round(log(2.7))').evaluate({}) # 1.0
# substitute
expr = parser.parse('2 * x + 1')
expr2 = expr.substitute('x', '4 * x') # ((2*(4*x))+1)
expr2.evaluate({'x': 3}) # 25
# simplify
expr = parser.parse('x * (y * atan(1))').simplify({'y': 4})
expr.toString() # x*3.141592
expr.evaluate({'x': 2}) # 6.283185307179586
# get variables
expr = parser.parse('x * (y * atan(1))')
expr.variables() # ['x', 'y']
expr.simplify({'y': 4}).variables() # ['x']
支持的运算符
from py_expression_eval import Parser
parser = Parser()
parser.parse('2 + 3').evaluate({}) # 5
parser.parse('2 - 3').evaluate({}) # -1
parser.parse('2 * 3').evaluate({}) # 6
parser.parse('2 / 3').evaluate({}) # 0.6666666666666666
parser.parse('2 % 3').evaluate({}) # 2
parser.parse('-2').evaluate({}) # -2
parser.parse('abs(-2)').evaluate({}) # 2
parser.parse('ceil(1.4)').evaluate({}) # 2.0
parser.parse('floor(1.4)').evaluate({}) # 1.0
parser.parse('round(1.4)').evaluate({}) # 1.0
parser.parse('2^3').evaluate({}) # 8.0
parser.parse('sqrt(16)').evaluate({}) # 4.0
parser.parse('sin(3.14)').evaluate({}) # 0.0015926529164868282
parser.parse('cos(3.14)').evaluate({}) # -0.9999987317275395
parser.parse('tan(3.14)').evaluate({}) # -0.0015926549364072232
parser.parse('asin(1)').evaluate({}) # 1.5707963267948966
parser.parse('acos(1)').evaluate({}) # 0.0
parser.parse('atan(1)').evaluate({}) # 0.7853981633974483
parser.parse('log(2.7)').evaluate({}) # 0.9932517730102834
parser.parse('exp(1)').evaluate({}) # 2.718281828459045
parser.parse('log(E)').evaluate({}) # 1.0
parser.parse('cos(PI)').evaluate({}) # -1.0
parser.parse('x||y').evaluate({'x': 2, 'y': 3}) # '23'
parser.parse('num in (1,2,3)').evaluate({'num': 1}) # True
parser.parse('"word" in "word in sentence"').evaluate({}) # True
将包上传到 PyPi
生成分发存档
python3 setup.py sdist bdist_wheel
上传分发
ls -a dist/
twine upload dist/py_expression_eval-0.3.9*
检查: https://pypi.ac.cn/project/py-expression-eval/0.3.9/
更多详情: https://packaging.pythonlang.cn/tutorials/packaging-projects/