Sympy 获取符号名称
Sympy get Symbol name
我可以得到一个 "undefined" 交易品种的名称:
import sympy as sym
knodef = sym.Symbol('k_{nodef}')
print(type(knodef))
sym.pprint(knodef.name)
<class 'sympy.core.symbol.Symbol'>
k_{nodef}
但是当我把它定义为一个表达式时,我就再也找不到名字了。
kdef = sym.Symbol('k_{def}')
kdef = sym.tan(b*x)
print(type(kdef))
sym.pprint(kdef.name) # AttributeError: 'tan' object has no attribute 'name'
tan
<Error raised>
如何获取 kdef 的名称?
类似的功能...
knodef2 = sym.Function('k_{nodef2}')
#display(disp.Math(knodef2.name), type(knodef2))
print(type(knodef2))
sym.pprint(knodef2.name)
<class 'sympy.core.function.UndefinedFunction'>
k_{nodef2}
...(在这种情况下是否等效于定义 Symbol)?
正如您所演示的,Symbol 和 Function 的 name
属性可用于 return "name" 的字符串形式。对于 UndefinedFunction,您可以使用 .func.name
来获取该字符串,但是对于已定义的 FunctionClass,您可以在 func
属性上使用 str
:
>>> s=Symbol('s');f=Function('f');a=f(s);b=tan(s)
>>> s.name
's'
>>> f.name
'f'
>>> a.func.name
'f'
>>> str(b.func)
'tan'
根据 hpaulj 的评论和不可告人的实验和学习的答案...
分配 kdef = sym.Symbol('k_{def}')
分配名称 'k_{def}'
,因为这是 class sym.Symbol
.
的属性
后面赋值kdef = sym.tan(b*x)
只是定义了一个classsym.tan
的新对象,并把kdef
作为它的变量,其实和前一个对象。所以在这一点上,kdef
和'k_{def}'
.
之间就没有更多的关联了
这很容易看出:
kdef = sym.Symbol('k_{def}')
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = sym.tan(b*x)
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = k_{def}, address = 0x20f21b58228
kdef = tan(b*x), address = 0x20f21b584f8
这甚至发生在分配给相同类型时,原则上可以使用完全相同的内存块:
q = 2.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 30000.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 2.1, address = 0x1c4dbd5d0d0
q = 30000.1, address = 0x1c4dbd5d2b0
此外,还发现classsym.tan
没有name
,所以获取不到,因为不存在。
由于给定的变量可能有也可能没有 name
,因此可以简单地 try
/expect
,或使用 dir()
.
查询
我可以得到一个 "undefined" 交易品种的名称:
import sympy as sym
knodef = sym.Symbol('k_{nodef}')
print(type(knodef))
sym.pprint(knodef.name)
<class 'sympy.core.symbol.Symbol'>
k_{nodef}
但是当我把它定义为一个表达式时,我就再也找不到名字了。
kdef = sym.Symbol('k_{def}')
kdef = sym.tan(b*x)
print(type(kdef))
sym.pprint(kdef.name) # AttributeError: 'tan' object has no attribute 'name'
tan
<Error raised>
如何获取 kdef 的名称?
类似的功能...
knodef2 = sym.Function('k_{nodef2}')
#display(disp.Math(knodef2.name), type(knodef2))
print(type(knodef2))
sym.pprint(knodef2.name)
<class 'sympy.core.function.UndefinedFunction'>
k_{nodef2}
...(在这种情况下是否等效于定义 Symbol)?
正如您所演示的,Symbol 和 Function 的 name
属性可用于 return "name" 的字符串形式。对于 UndefinedFunction,您可以使用 .func.name
来获取该字符串,但是对于已定义的 FunctionClass,您可以在 func
属性上使用 str
:
>>> s=Symbol('s');f=Function('f');a=f(s);b=tan(s)
>>> s.name
's'
>>> f.name
'f'
>>> a.func.name
'f'
>>> str(b.func)
'tan'
根据 hpaulj 的评论和不可告人的实验和学习的答案...
分配 kdef = sym.Symbol('k_{def}')
分配名称 'k_{def}'
,因为这是 class sym.Symbol
.
后面赋值kdef = sym.tan(b*x)
只是定义了一个classsym.tan
的新对象,并把kdef
作为它的变量,其实和前一个对象。所以在这一点上,kdef
和'k_{def}'
.
这很容易看出:
kdef = sym.Symbol('k_{def}')
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = sym.tan(b*x)
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = k_{def}, address = 0x20f21b58228
kdef = tan(b*x), address = 0x20f21b584f8
这甚至发生在分配给相同类型时,原则上可以使用完全相同的内存块:
q = 2.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 30000.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 2.1, address = 0x1c4dbd5d0d0
q = 30000.1, address = 0x1c4dbd5d2b0
此外,还发现classsym.tan
没有name
,所以获取不到,因为不存在。
由于给定的变量可能有也可能没有 name
,因此可以简单地 try
/expect
,或使用 dir()
.