在 Python 中将数字传递给 Sympy 函数

Passing Numbers to a Sympy function in Python

提问人:ControltheAI 提问时间:1/14/2023 最后编辑:ControltheAI 更新时间:1/16/2023 访问量:127

问:

我正在练习 Codewars 的 Python。其中一个问题是将一个函数作为字符串中给出的输入,对其进行微分,然后使用另一个作为整数给出的输入并返回结果。例如,假设输入是

stringf=x**2+2x
inputint=3

def differentiate(stringf,inputint) 应返回 8。我设法通过使用 Sympy 和 eval 来做到这一点。但是,当我使用 sympy.diff 获取函数的派生时,它会将常规 lambda 函数转换为您无法传递参数的其他内容。例如,您可以在下面的代码中执行 f(1),但不能执行 deffunc(1),它会抛出错误“TypeError: 'Add' object is not callable”,因为 deffunc 的类型在 sympy.diff 之后变为 “<class 'sympy.core.add.Add'>”。

def differentiate(equation, point):
    import sympy as sym
    
    f=lambda x:equation            #turn the string into a formula with x
    
    x= sym.symbols('x')    
    deffunc=sym.diff(f(x),x)       #differentiate with respect to x
    
    strfunc=str(deffunc)           #convert the function to a string to be used in eval
    x=point
    f=eval(strfunc)

    return f

我找到了一种解决方法,只需将其转换为字符串,然后使用 eval 即可,但我想知道是否有更好的方法将“点”传递到“deffunc”中?

python-3.x 函数 参数传递 sympy eval

评论

0赞 hpaulj 1/14/2023
sympy 有自己的形式 ,它接受一个字符串并返回一个 sympy 表达式。eval
0赞 hpaulj 1/14/2023
不要混淆 python 函数、sympy 表达式和 strjngs。在尝试任何花哨的东西之前,先研究一下对称基础,尤其是陷阱。还要检查 codewars 是否希望您使用纯 python。在这种情况下,Sympy 可能是一种作弊。
0赞 ControltheAI 1/16/2023
CodeWars 不允许 Sympy,你是对的。我需要在没有任何额外库的情况下在常规 python 功能范围内找到一些东西。然而,这不是问题。我想学习如何将参数传递给函数。当您将函数定义为 def samplefunction(parameter1, parameter2) 时,您可以执行此操作,但是当我将函数定义为 x= lambda x:x**2 时呢?那我该如何使用传递参数(不是数组,我知道你可以将“map”与数组一起使用)
0赞 ControltheAI 1/16/2023
好吧,事实证明,您实际上可以通过简单地调用 f(1) 将参数传递给 lambda 函数。但是sympy在微分后将函数转换为其他函数。我打印了 f 的类型,它们肯定是“<类'function'>”和“<类'sympy.core.add.Add'>”。那么问题就变成了如何将参数传递给 sympy

答: 暂无答案