2016-07-07 287 views
2

我知道sympy的lambdify功能可以創建參數variables一個lambda和身體expression這樣的:設置默認值

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表達式中提取它們。

回答

0

它使用字符串的事實是一個意外。 lambdify的工作方式是創建一個表達式的字符串形式,然後轉義字符串"lambda %s: (%s)" % (', '.join(map(str, args)), expr)(它實際上比一般情況稍複雜一些,但這是基本思想)。所以如果參數是('x', 'y=0'),那最後插入爲lambda x, y=0: ...

眼下lambdify沒有一個選項,以使參數關鍵字參數,所以你最好的選擇是:

  • 手動創建關鍵字參數使用字符串(你已經發現作品),或

  • 包裹lambdified功能在新的λ,像

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

    要做到這一點在一般情況下,CA n個寫入一些功能,創建你想要的任何邏輯關鍵字參數的包裝,像

    def create_wrapped(args, expr): 
        func = lambdify(args, expr) 
        @functools.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 
    
+0

我想我會只是轉換爲字符串,並使用該 –