Ogni numero SymPy è rappresentato da un'istanza di the class Number
. Float
s, Integer
s e Rational
s sono sottoclassi di Number
. Zero
è una sottoclasse di Integer
.
è possibile ispezionare la classe stirpe pieno di un oggetto chiamando il metodo mro
(ordine risoluzione dei metodi) di sua classe:
In [34]: from sympy import S
In [38]: type(S.Zero).mro()
Out[38]:
[sympy.core.numbers.Zero,
sympy.core.numbers.IntegerConstant,
sympy.core.numbers.Integer, <-- Zero is a kind of Integer
sympy.core.numbers.Rational,
sympy.core.numbers.Number,
sympy.core.expr.AtomicExpr,
sympy.core.basic.Atom,
sympy.core.expr.Expr,
sympy.core.basic.Basic,
sympy.core.evalf.EvalfMixin,
object]
Queste sottoclassi "insegnare" SymPy come manipolare e semplificare le espressioni simbolicamente. Come esempio , le istanze della classe razionale sono negated this way:
def __neg__(self):
return Rational(-self.p, self.q)
Vale a dire, se x
è un'istanza di Rational
, poi -x
provoca x.__neg__()
di essere chiamato. Nel frattempo, le istanze della classe Integer
, sono negated by
def __neg__(self):
return Integer(-self.p)
E se l'oggetto è, in particolare, un esempio di Zero
, poi its negation è definito da:
@staticmethod
def __neg__():
return S.Zero # the negation of Zero is still Zero
Zero
, One
e MinusOne
implementare anche un metodo _eval_power
che "insegna" questi oggetti come valutare x
elevato a una potenza (dove x
è Zero
, One
o MinusOne
). Ad esempio, si Zero
raised to a positive expression uguale:
def _eval_power(self, expt):
if expt.is_positive:
return self
...
One
raised to anything stesso uguale:
def _eval_power(self, expt):
return self
Se si sfogliare the source code per il modulo sympy.core.numbers
, troverete carichi di definizioni, che sono a tutti gli effetti insegnamento SymPy come a fare simbolico aritmetica. Non è molto diverso da quello che viene insegnato ai bambini in classe matematica, tranne che è espresso in computer.
Ci si potrebbe chiedere perché non esiste una classe speciale per ogni intero. Integers
oltre a Zero
, One
e MinusOne
vengono considerati come istanze della classe generale . Le loro regole di addizione e moltiplicazione e così via sono disposte là.A differenza Zero
, One
e MinusOne
che sono instantated quando viene caricato il modulo, altri numeri interi vengono memorizzati nella cache only as needed:
def __new__(cls, i):
...
try:
return _intcache[ival] # <-- return the cached Integer if seen before
except KeyError:
obj = Expr.__new__(cls) # <-- create a new Integer if ival not in _intcache
obj.p = ival
_intcache[ival] = obj
return obj
Che diamine hai fatto a ottenere 'type (1)' per essere qualcosa di diverso da 'int'? – user2357112
@ user2357112 ha appena importato il modulo sympy –
L'importazione di sympy non creerà problemi con il parser. 'type (1)' costruirà sempre un vero intero Python e prenderà il suo tipo, che sarà 'int'. – user2357112