我是新手sympy
,我无法弄清楚
from sympy.core import S
究竟S
是什么?什么S.true
意思?
有一点混乱,因为S
实际上是两件事.
首先是它SingletonRegistry
.SymPy中的几个类经常出现,它们是单例化的,也就是说,使用一些元编程,它们只能被实例化一次.例如,每次创建时Integer(0)
,都会返回相同的实例Zero
.所有单例实例都是S
对象的属性,因此Integer(0)
也可以作为S.Zero
.
单一化具有两个优点:它可以节省内存,并且可以进行快速比较.它节省了内存,因为无论单例化对象在内存中的表达式中出现多少次,它们都指向内存中的相同单个实例.快速比较来自于您可以is
用来比较Python中的精确实例(通常,您需要==
用来比较事物).因此,您可以测试a is S.Zero
以检查是否a
是Integer(0)
实例.
在大多数情况下,某些对象是单例化的这一事实是一个您不必担心的实现细节.S
最终用户的主要优点是可以方便地访问难以键入的某些实例,例如S.Half
(而不是Rational(1, 2)
),或者S.true
(旁注:S.true
是SymPy版本的True
.不像True
,它不是子类int
,所以你可以写像~S.true
(不是真的)这样的东西,它会给S.false
(对比,~True
给出-2
,这不是作为布尔值的假).
第二件事是快捷方式sympify
. sympify
是将Python对象转换int(1)
为SymPy对象的函数,例如Integer(1)
.它还将表达式的字符串形式转换为SymPy表达式sympify(x**2) -> Symbol("x")**2
.S(1)
与sympify(1)
(基本上S.__call__
已被定义为调用sympify
)相同.
这是为了方便,因为S
是一个字母.它主要用于定义有理数.考虑像这样的表达式x + 1/2
.如果你直接在Python中输入它,它将评估1/2
并给出0.5
(或者只是0
在Python 2中,因为整数除法),因为两个参数都是int
s.但是,在SymPy中,通常需要两个整数的商来给出一个精确的有理数.Python的评估工作方式,运营商的至少一方需要成为SymPy评估接管的SymPy对象.你可以写这个x + Rational(1, 2)
,但这是更多的打字.更短的版本是x + S(1)/2
.由于S(1)
返回Integer(1)
,除法将返回一个Rational
类型,因为它将调用Integer.__div__
,它知道如何返回a Rational
.