假设我有以下内容:
x=Symbol('x')
f=Function('f')(x)
type(f)
f
为什么type(f)=f
?
为什么不是 UndefinedFunction ?
如何更一般地识别这种功能?
答案 0 :(得分:0)
它是AppliedUndef的一个实例,因为它已被“应用”(变量x)。在此之前,它是一个UndefinedFunction。
让我们分别考虑两个步骤:创建一个函数并应用它。当它们混合在一起时,我们失去了函数和表达式之间的差异,这是SymPy和数学中常见的混淆源。
>>> f = Function('f')
>>> type(f)
<class 'sympy.core.function.UndefinedFunction'>
这是一个未定义的函数。值得注意的是,它是一个类而不是一个对象。也许它应该是一个对象(a long-standing issue),但另一方面,这种行为与定义的函数(sin
,log
)是一致的。您可以测试f是UndefinedFunction:
>>> from sympy.core.function import UndefinedFunction
>>> isinstance(f, UndefinedFunction)
True
当您将f应用于x,创建f(x)
时,结果是类f
的SymPy表达式,就像sin(x)
是类sin
的表达式一样。我们如何测试这个表达式是否是一个应用于某个东西的未定义函数?让我们看看:
>>> type(f(x)).__mro__
(f, AppliedUndef, Function, Application, <class 'sympy.core.expr.Expr'>, <class 'sympy.core.basic.Basic'>, <class 'sympy.core.evalf.EvalfMixin'>, <class 'object'>)
因此,AppliedUndef是您要在这里查看的课程。
>>> from sympy.core.function import AppliedUndef
>>> isinstance(f(x), AppliedUndef)
True
使用isinstance(..., ...)
进行测试,而不是type(...) == ...