【问题标题】:Set default values for sympy lambdify arguments为 sympy lambdify 参数设置默认值
【发布时间】:2021-01-20 03:51:14
【问题描述】:

我知道 sympy 的 lambdify 函数可以创建一个带有参数 variables 和正文 expression 的 lambda,如下所示:

lambdify(variables, expression)

所以

lambdify((Symbol('x'), Symbol('y')) , 'x**2 + y')

生产

lambda x, y: x**2 + y

但是如何为某些变量赋予默认值呢?得到类似的东西

lambda x, y=0: x**2 + y

?

我知道我可以使用 lambdify(('x', 'y=0') , 'x**2 + y') 之类的字符串来执行此操作,但我需要使用 sympy 符号对象,因为我是从其他 sympy 表达式中提取它们的。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    它与字符串一起工作的事实是一个意外。 lambdify 的工作方式是创建表达式的字符串形式,然后对字符串 "lambda %s: (%s)" % (', '.join(map(str, args)), expr) 求值(实际上它比一般情况要复杂一些,但这是基本思想)。因此,如果 args 是 ('x', 'y=0'),则最终会被插入为 lambda x, y=0: ...。

    现在lambdify 没有选项可以使参数成为关键字参数,因此您最好的选择是:

    • 使用字符串手动创建关键字参数(您已经发现有效),或者

    • 将lambdified函数包装在一个新的lambda中,比如

        lambda x, y=0: lambdify((x, y), expr)(x, y)
      

      要在一般情况下执行此操作,您可以编写一些函数来创建关键字参数包装器,其中包含您想要的任何逻辑,例如

        from functools import wraps
      
        def create_wrapped(args, expr):
            func = lambdify(args, expr)
            @wraps(func)
            def wrapped(*_args, **kwargs):
                # Write the logic here to parse _args and kwargs for the arguments as you want them
                return func(*actual_args)
            return wrapped
      

    【讨论】:

    • 我想我会转换成一个字符串并使用它
    • 还有:导入 functools
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2010-10-28
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多