我是sympy
的新手,我无法弄清楚
from sympy.core import S
实际上S
是什么? S.true
是什么意思?
答案 0 :(得分:12)
有点混乱,因为S
实际上是两件事。
首先是SingletonRegistry
。 SymPy中的几个类经常出现,因为它们是 singletonized ,也就是说,使用一些元编程它们是这样做只能实例化一次。例如,每次创建Integer(0)
时,都会返回相同的实例Zero
。所有单例实例都是S
对象的属性,因此Integer(0)
也可以作为S.Zero
进行访问。
Singletonization提供两个优点:它可以节省内存,并且可以进行快速比较。它节省了内存,因为无论单例化对象出现在内存中的表达式中多少次,它们都指向内存中的相同单个实例。快速比较来自于您可以使用is
来比较Python中的确切实例(通常,您需要使用==
来比较事物)。因此,您可以测试a is S.Zero
以检查a
是否为Integer(0)
实例。
在大多数情况下,某些对象是单例化的这一事实是一个您不应该担心的实现细节。 S
对最终用户的主要优势是可以方便地访问难以输入的特定实例,例如S.Half
(而不是Rational(1, 2)
)或S.true
(侧面)注意:S.true
是True
的SymPy版本。与True
不同,它不是int
的子类,因此您可以编写~S.true
之类的内容(不是真的) )它会给S.false
(与~True
形成对比,后者给出-2
,这不是布尔值的假。)
第二件事是sympify
的快捷方式。 sympify
是将int(1)
等Python对象转换为SymPy对象的函数,例如{ {1}}。它还将表达式的字符串形式转换为SymPy表达式,如Integer(1)
。 sympify(x**2) -> Symbol("x")**2
与S(1)
相同(基本上,sympify(1)
已被定义为调用S.__call__
)。
这是为了方便起见,因为sympify
是一个字母。它主要用于定义有理数。考虑像S
这样的表达式。如果你直接在Python中输入它,它将评估x + 1/2
并在Python 2中给出1/2
(或仅0.5
,因为整数除法),因为两个参数都是{{1} }秒。但是,在SymPy中,通常需要两个整数的商来给出一个精确的有理数。 Python的评估工作方式,运营商的至少一方需要成为SymPy评估接管的SymPy对象。您可以将其写为0
,但这样可以输入更多内容。较短的版本是int
。由于x + Rational(1, 2)
会返回x + S(1)/2
,因此该部门将返回S(1)
类型,因为它会调用Integer(1)
,它知道如何返回Rational
。
答案 1 :(得分:1)
许多人已经联系起来,S
用于访问单身人士。根据{{3}},class SingletonRegistry
是S
的实例。 S.One
做了两件事:
S.Zero
和S(1)
等实例is
)。使用单例的原因是您可以使用==
而不是is
来比较对象。 1
速度更快,但只有在您知道确定时1
与您正在测试的>>> Basic() is Basic()
False
>>> MySingleton() is MySingleton()
True
>>> S.MySingleton is MySingleton()
True
相同才有效。 the source举了一个例子:
def test(tocheck):
count = 0
for number in range(1, 1000):
for div in tocheck:
if not number % div:
break
else:
#else on a loop means it ran to completion w.o. break
count += 1
print("%d not divisible by %s" % (count, tocheck))
test([2,3,5])
test([2,3,5,7])