Par exemple, si je lance
import sympy
x, y, z = sympy.symbols('x:z')
f = sympy.exp(x + y) - sympy.sqrt(z)
existe-t-il une méthode de f
que je peux utiliser pour obtenir une liste ou un tuple d'objets sympy.Symbol
que l'expression contient? Je préfère ne pas avoir à analyser srepr(f)
ou à analyser vers le bas via f.args
.
Dans ce cas, g.args[0].args[1].args[0]
Me donne Symbol("z")
, tandis que g.args[1].args[0].args
Me donne le Tuple (Symbol("x"), Symbol("y"))
, Mais évidemment, cela est spécifique à l'expression.
Vous pouvez utiliser:
f.free_symbols
qui renverra un ensemble de tous les symboles gratuits.
Exemple:
>>> import sympy
>>> x, y, z = sympy.symbols('x:z')
>>> f = sympy.exp(x + y) - sympy.sqrt(z)
>>> f.free_symbols
set([x, z, y])
Notez que réponse JuniorCompressors répertorie uniquement les variables libres .
Si vous avez un Sum
, un Product
, un Integral
, ou quelque chose similaire, vous pouvez ou non vouloir connaître en plus la variable d'intégration/sommation en utilisant le .variables
attribut:
In [216]: (x, n) = sympy.symbols("x n")
In [217]: f = sympy.Sum(x, (n, 0, 10))
In [218]: f.free_symbols
Out[218]: {x}
In [219]: f.variables
Out[219]: [n]
Un attribut très utile est atoms
x, y, z = sympy.symbols('x:z')
expr1 = sympy.exp(x + y) - sympy.sqrt(z)
display(expr1.free_symbols)
display(expr1.atoms(sympy.Symbol))
{????,????,????}
{????,????,????}
En plus des symboles, atoms
peut extraire d'autres atomes, par exemple:
display(expr1.atoms(sympy.Function))
display(expr1.atoms(sympy.Number))
display(expr1.atoms(sympy.NumberSymbol))
display(expr1.atoms(sympy.function.AppliedUndef))
display(expr1.atoms(sympy.Mul))
display(expr1.atoms(sympy.Add))
(cela vaut la peine de vérifier la sortie). Concernant le réponse par gerrit
n = sympy.Symbol('n')
k2 = sympy.Sum(x, (n, 0, 10))
display(k2.free_symbols)
display(k2.variables)
display(k2.atoms(sympy.Symbol))
{????}
[????]
{????,????}