Python 为什么可以';在同一点上,我是否评估已实现的函数的组合?

Python 为什么可以';在同一点上,我是否评估已实现的函数的组合?,python,sympy,Python,Sympy,代码非常简单: >>> from sympy.utilities.lambdify import implemented_function >>> f = implemented_function('f', lambda x: x ** 2) >>> g = implemented_function('g', lambda x: 2 * x) >>> print(f( 2 ).evalf()) 4.000000000000

代码非常简单:

>>> from sympy.utilities.lambdify import implemented_function
>>> f = implemented_function('f', lambda x: x ** 2)
>>> g = implemented_function('g', lambda x: 2 * x)
>>> print(f(  2 ).evalf())
4.00000000000000
>>> print(  g(2) .evalf())
4.00000000000000
>>> print(f(g(2)).evalf())
f(g(2))

这让我快发疯了。为什么表达式没有被评估,我应该如何修复它?

我不能直接回答你的问题,我也不知道你的总体目标是什么。但这种方法有用吗

>>> from sympy import *
>>> class square(Function):
...     @classmethod
...     def eval(cls, x):
...         if x.is_integer or x.is_real:
...             return x**2
... 
>>> class double(Function):
...     @classmethod
...     def eval(cls, x):
...         if not x.is_integer or x.is_real:
...             return 2*x
... 
>>> double(square(3))
18
>>> var('x')
x
>>> double(square(x)).subs(x,5)
50

我认为这是症状的一种错误。code>evalf没有递归调用
\u imp
。我已经打开了

关于
\u imp
eval
的对比,
实现的功能的文档字符串

请注意,这是一种快速解决方法,而不是创建特殊符号函数的一般方法。如果您想创建一个符号函数供Symphy的所有机器使用,那么您应该对function类进行子类化

\u imp\u
的主要目的是在lambdify中使用,将数值实现附加到符号函数


如果您只对符号求值或使用
evalf
求值感兴趣,则应将
函数子类化,并分别定义
eval
\u evalf

您可以使用
lambdify
x=sympy.symbols('x')
sympy.lambdify(x,f(g(x))(2)
的计算结果为16。@unutbu:这难道不符合使用
实现的函数的意义吗?如果我可以依赖一个通用符号表达式,那么我只需要正常操作它并进行替换,而不是通过
implemented\u函数
。您是否尝试过
f(g(2).evalf().evalf()
f(g(2).evalf())
?也许这不是你想要的。@pazitos10:不,不是……我不知道这个方法的含义是什么(我甚至不知道
eval
是否存在)。这与使用
\u imp\u
实现的功能
有何不同?这是正常的还是黑客行为?绝对不是黑客行为。正如Meurer在几天前的一次回答中提到的那样。我不知道它和你提到的代码有什么不同。我想这是为Symphy添加任意函数的安排。+1有趣,谢谢。让我想知道如果这样做效果很好,
\u imp\u
的意义是什么。。。我们一定要放弃一些东西!如此悲观的人有趣的是,我刚刚在SymPy中发现了另一个bug。尝试将
@classmethod
更改为
@staticmethod
并删除第一个参数,它会错误地推断出
nargs
。+1啊,我没有意识到它明确用于数值计算!这就解释了一些事情。好的,有点相切,但如果我这样做,那么我仍然必须覆盖
fdiff
使其可微,对吗?或者它会自动区分我返回的符号表达式吗?(虽然我想我可以这样做,然后看看)如果您从
eval
返回一个表达式,那么它将立即进行计算。因此,diff将对返回的表达式求值。如果使其保持未计算状态(从
eval
返回
None
),则需要定义导数。听起来不错,谢谢!!这实际上让我的生活更轻松,因为我确实有一个表达式要返回。谢谢