我使用Sympy来计算用户提供的符号表达式,但是除法运算符的行为与其他任何数学运算符不同。当用重写运算符对对象求值时,我得到了加法、减法和乘法的预期结果,而不是除法。下面的代码说明了我的问题:
import sympy
import numpy
class NewMath(int):
def __add__(self, other):
print "Adding!"
return
def __sub__(self, other):
print "Subtracting!"
return
def __mul__(self, other):
print "Multiplying!"
return
def __div__(self, other):
print "Dividing!"
return
three = NewMath(3)
four = NewMath(4)
three + four
three - four
three * four
three / four
# Override sympys default math
func_map = {'+':NewMath.__add__,
'/':NewMath.__div__}
lambda_args = [sympy.Symbol(arg) for arg in ['three', 'four']]
print "Now sympy math:"
lambda_addition = sympy.lambdify(lambda_args, sympy.Symbol('three') + sympy.Symbol('four'), modules=func_map)
lambda_addition(three, four)
lambda_subtraction = sympy.lambdify(lambda_args, sympy.Symbol('three') - sympy.Symbol('four'), modules=func_map)
lambda_subtraction(three, four)
lambda_multiplucation = sympy.lambdify(lambda_args, sympy.Symbol('three') * sympy.Symbol('four'), modules=func_map)
lambda_multiplucation(three, four)
lambda_division = sympy.lambdify(lambda_args, sympy.Symbol('three') / sympy.Symbol('four'), modules=func_map)
lambda_division(three, four)
输出:
^{pr2}$我读过Sympy Docs并看到/
运算符是一个常见的问题,但文档似乎只是指示除法将默认为整数除法,我看不到任何指示{modules
参数手动将division替换为自定义运算符,但没有成功。在
我也看到了{a2},这是否意味着我的事业没有希望了?在
我使用的是python2.7和sympy1.0
你的事业当然不是完全没有希望的。这里有几个选项可以让你开始。在
首先,似乎您了解了}之间的区别,但是如果您还不了解,here是一些Python2.7文档。在
\__div__ \__truediv__
和{在Python2.7中,重写}文档除外。为了避免这个问题,您还可以重写求幂运算符。在
\__div__
似乎应该做您想做的事情,除了您发现的关于a/b
被计算为a * b^(-1)
的{我尝试在python3环境中运行代码,更改print的所有实例,使它们具有圆括号,并将
div
的所有实例替换为truediv
。在这不是一个完整的答案,但我不能发表评论,所以这是你得到的!在
相关问题 更多 >
编程相关推荐