2017-01-25 69 views
1

我是新來sympy,我想不出是什麼`S`表示在sympy

from sympy.core import S 

實際上S是什麼? S.true是什麼意思?

+2

[Singleton](http://docs.sympy.org/0.7.1/modules/core.html#module-sympy.core.singleton)。 – erip

+5

我投票結束這個問題作爲題外話,因爲它沒有顯示研究工作。 – erip

+2

@erip我只是試圖尋找答案,它對我來說實際上並不明顯!我不會關閉。此外,「Singleton」的文檔不太明確說明它的含義或何時使用它:)。 – cxw

回答

5

有一個有點混亂,因爲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.trueTrue的SymPy版本不同於True,它不從int子類,所以你可以寫的東西像~S.true(不是真的),它會給S.false(對比度與~True,這給-2,這是不假的布爾值)。

第二件事是是sympify的快捷方式。sympify是將Python對象(如int(1))轉換爲SymPy對象(例如Integer(1))的函數。它還將表達式的字符串形式轉換爲像sympify(x**2) -> Symbol("x")**2這樣的SymPy表達式。 S(1)sympify(1)(基本上,S.__call__已被定義爲呼叫sympify)是相同的。

這是爲了方便,因爲S是單個字母。這對定義有理數很重要。考慮像x + 1/2這樣的表達式。如果直接在Python中輸入,則它將評估1/2並給出0.5(或者Python 2中的0,因爲整數除法),因爲這兩個參數都是int s。但是,在SymPy中,通常需要兩個整數的商給出一個確切的有理數。 Python的評估工作方式,至少運營商的一方必須是SymPy評估接管的SymPy對象。你可以把它寫成x + Rational(1, 2),但這是更多的輸入。較短的版本是x + S(1)/2。由於S(1)返回Integer(1),該部門將返回一個Rational類型,因爲它將調用Integer.__div__,它知道如何返回Rational

+0

所以,這意味着如果我寫'如果f是S.true'(其中'f'是一個表達式)將只檢查f是否爲真,如果是則它進一步檢查條件。 –

+0

我解釋一下吧@asmeurer *注意:這是參考模塊'sympy.solvers.solveset'行'837' [link](https://github.com/Yathartha22/sympy/blob/master /sympy/solvers/solveset.py) –

+0

@Yathartha是的,這是正確的。 – asmeurer

1

許多人已經鏈接,S是用於訪問單身人士。每the source,Sclass SingletonRegistry的一個實例。 S做兩兩件事:

  • ,您可以訪問如S.OneS.Zero情況下,它代表代表根據自己的常量基本常數
  • ,您可以創建或訪問單身(例如,S(1))。

使用單例的原因是,您可以將對象與is而不是==進行比較。 is更快,但只有當您知道肯定您的1與您正在測試的1相同時纔有效。 The code舉了一個例子:

>>> Basic() is Basic() 
False 
>>> MySingleton() is MySingleton() 
True 
>>> S.MySingleton is MySingleton() 
True 
+0

現在,如果它是 '如果f是S.true',其中f是一個表達式(比如'x + 1')。這意味着什麼? –

+0

@Yathartha它檢查'f'完全返回['True' singleton](http://docs.sympy.org/latest/modules/logic.html#sympy.logic.boolalg.BooleanTrue)。這意味着什麼取決於'f'。我不知道「x + 1」如何返回一個布爾變量,我很抱歉地說。 – cxw

+0

還是謝謝! @cxw。 我有我的懷疑位清除.. –

相關問題