跳转到主要内容

Python数学表达式计算器

项目描述

Python数学表达式计算器

Build Status

PyPi version PyPi downloads

Coverage Status

基于js-expression-eval,由Matthew Crumley编写(email@matthewcrumley.comhttp://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/

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

py_expression_eval-0.3.14.tar.gz (13.1 kB 查看哈希值)

上传

构建分发

py_expression_eval-0.3.14-py3-none-any.whl (12.5 kB 查看哈希值)

上传 Python 3

由以下支持