2016-07-25 26 views
0

最近我使用布尔网络,我使用sympy来操作布尔函数。我认为这可能是非常基本的问题,但我找不到任何线索。在sympy中,如何将函数表达式转换为运算符重载表达式?

以下线路运行良好。

>>>from sympy import * 
>>>x,y = symbols("x y") 
>>>(x | y) & x 
And(Or(x, y), x) 

这里我有一个很简单的问题。 'And(Or(x,y),x)'如何表示为'(x | y)& x'?

谢谢

回答

0

Sympy广泛使用Python操作符重载功能。 在Python中,每个类都可以定义为任何数学运算符将生效,通过定义具有特殊名称的方法 - 这些方法总是以__作为前缀和后缀,并且在Python Data Model中进行了描述。

Sympy符号和表达式是重新定义所有与运算符相关的方法以执行返回Sympy表达式对象而不是数字结果的操作的对象。

因此,bynary和&的dbinary或|运营商只是一个什么Sympy做一部分,长英文版本提供AndOr函数调用,以及便于在某些情况下打字和可读性。

+0

感谢您的详细回复。有没有简单的函数将字符串变量'And(Or(x,y),x)'转换为字符串变量'(x | y)&x'?如果解决方案不简单,那么你能否提供一些提示? –

0

如果你只是想更好的打印,可以运行

init_printing() 

,它将它使用Unicode字符,甚至LaTeX的,如果它是可用的(像Jupyter笔记本)

In [1]: (x | y) & x 
Out[1]: x ∧ (x ∨ y) 

打印你也可以使用pprint()函数来直接获取它。

它看起来像默认SymPy打印机使用AndOr代替&|符号打印逻辑表达式,因此,如果要明确这些,你就需要继承sympy.printing.str.StrPrinter和覆盖_print_And_print_Or(见current implementation到了解这将如何工作)。

+0

我已经打开了一个问题来更改SymPy中的默认打印https://github.com/sympy/sympy/issues/11435 – asmeurer

+0

我发现它是针对我的问题的一个很好的解决方案。谢谢你的提示。 –