为了账号安全,请及时绑定邮箱和手机立即绑定

如何用 Python(Sympy) 实现一个函数

如何用 Python(Sympy) 实现一个函数

幕布斯7119047 2021-12-29 11:00:25
在 Wolfram Mathematica 中,我可以使用 ToExpression 将字符串转换为表达式,并对表达式求值。一个例子:Reflection[expr_, a_] := expr /. a[l_] -> I*a[-l]StringA = "Reflection[a[0]b[3],b]"Output=ToExpression[StringA]结果是 ia[0]b[-3]但是,我不知道如何在 Python(或 Sympy)中实现这样的事情。import numpy as npimport sympy as spa, b, c, d, e, f=map(sp.IndexedBase,['a','b','c','d','e', 'f'])  l1=map(sp.Wild,['l1'])imagI=sp.I ## equals to Imaginarydef Reflection(expr, p):    expr=imagI*expr.replace(p[l1],p[-l1], map=False, simultaneous=True, exact=False)    return exprfundict={'Reflection':Reflection}pdict={'a':a,'b':b,'c':c,'d':d,'e':e,'f':f}  ##A dictionary used for connect the string to existed variablemydict=dict(fundict,**pdict) ## combine two dictionaryStringA ='Reflection(a(0)b(3),b)'如何实现与 ToExpression 相同的工作?还有更复杂的情况:Reflection[expr_, a_] := expr /. a[l_] -> I*a[-l]OAMHolo[expr_, a_, n_] := expr /. a[l_] -> a[l + n]StringA = "Reflection[OAMHolo[Reflection[a[0]b[3],b],a,3],b]"Output=ToExpression[StringA]输出是 -a[3]b[3]对于 python 案例,我尝试了 exec()、replace() 但这些都不起作用。那么如何在Python中实现这种情况呢?非常感谢你!
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

sympify将字符串转换为表达式。要在 中使用自定义对象sympify,请将它们作为字典传递给第二个参数。


这是您的示例(我还修复了一些小错误)


>>> l1 = Wild('l1')

>>> StringA = 'Reflection(a[0]*b[3], b)'

>>> sympify(StringA, mydict)

I*a[0]*b[-3]

关于sympifyvs. eval,内部sympify使用eval。它更聪明一点,


sympify('1/2')将产生Rational(1, 2)而eval('1/2')产生0.5。

sympify还自动将表达式中的任何未定义变量转换为 Symbol 或 Function,而eval不会。

sympify自动计算 SymPy 命名空间中的表达式,因此将自动定义任何 SymPy 函数(eval您必须手动导入名称或将其添加到字典中作为第二个参数)

将来sympify可能会变得比eval安全性更好(参见https://github.com/sympy/sympy/pull/12524)。目前,两者都可以执行任意代码,因此在不受信任的输入上使用它们是不安全的。

两者的性能都应该可以忽略不计。所以我建议使用sympify而不是eval创建 SymPy 表达式。


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信