我有很多代表数学表达式的长字符串(每个 9000 多个字符)。我最初使用 python 符号代数包 sympy 生成表达式。一个截断的例子是:
a = 'm[i]**2*(zb[layer]*m[i]**4 - 2*zb[layer]*m[j]**2*m[i]**2 + zb[layer]*m[j]**4 - zt[layer]*m[i]**4 + 2*zt[layer]*m[j]**2*m[i]**2 - zt[layer]*m[j]**4)**(-1)*ab[layer]*sin(m[i]*zb[layer])*sin(m[j]*zb[layer])'
我最终复制了字符串中的文本,然后使用 is 作为代码(即复制 ' 和 ' 之间的文本,然后将其粘贴到函数中作为代码):
def foo(args):
return m[i]**2*(zb[layer]*m[i]**4 - 2*zb[layer]*m[j]**2*m[i]**2 + zb[layer]*m[j]**4 - zt[layer]*m[i]**4 + 2*zt[layer]*m[j]**2*m[i]**2 - zt[layer]*m[j]**4)**(-1)*ab[layer]*sin(m[i]*zb[layer])*sin(m[j]*zb[layer])
长长的代码行变得笨拙并减慢了我的 IDE (Spyder) 的速度,所以我想在其中添加一些换行符(代码可以像一长行一样正常工作)。通过将表达式括在括号中并自己放入换行符,我已经成功地手动完成了此操作(即按照PEP8使用隐式行继续):
def foo(args):
return (m[i]**2*(zb[layer]*m[i]**4 - 2*zb[layer]*m[j]**2*m[i]**2 +
zb[layer]*m[j]**4 - zt[layer]*m[i]**4 + 2*zt[layer]*m[j]**2*m[i]**2 -
zt[layer]*m[j]**4)**(-1)*ab[layer]*sin(m[i]*zb[layer])*sin(m[j]*zb[layer]))
我想要一些可以为我放入换行符的功能或功能。我尝试过使用该textwrap
模块,但这会将线路拆分到不合适的位置。例如,在下面的代码中,最后一行在“层”中间拆分,这使我的数学表达式无效:
>>> import textwrap
>>> a = 'm[i]**2*(zb[layer]*m[i]**4 - 2*zb[layer]*m[j]**2*m[i]**2 + zb[layer]*m[j]**4 - zt[layer]*m[i]**4 + 2*zt[layer]*m[j]**2*m[i]**2 - zt[layer]*m[j]**4)**(-1)*ab[layer]*sin(m[i]*zb[layer])*sin(m[j]*zb[layer])'
>>> print(textwrap.fill(a,width=70))
m[i]**2*(zb[layer]*m[i]**4 - 2*zb[layer]*m[j]**2*m[i]**2 +
zb[layer]*m[j]**4 - zt[layer]*m[i]**4 + 2*zt[layer]*m[j]**2*m[i]**2 -
zt[layer]*m[j]**4)**(-1)*ab[layer]*sin(m[i]*zb[layer])*sin(m[j]*zb[lay
er])
当我将字符串粘贴为代码时,我手动拆分字符串并仍然具有有效表达式的经验法则是:
- 将整个表达式括在
()
. - 在空格或
+
,-
,*
,]
,之后以大约 70 个字符宽分割)
。