Python中分割数学计算的简洁方法

11

我使用ninja-ide,我觉得它可以因为各种原因(黄色下划线)而抱怨一切,因为我认为这是提高我的编码质量的方式。

然而,由于它还抱怨代码行长度(这当然很有道理,因为没有人喜欢横向滚动来阅读代码),所以我被卡住了。

假设这行代码:

 v1, v2 = np.sum(((b1 - m1) ** 2) * p1) / q1, np.sum(((b2 - m2) ** 2) * p2) / q2

它包括空格在内共有81个字符,在这种情况下,我可以像这样分割:

    v1 = np.sum(((b1 - m1) ** 2) * p1) / q1
    v2 = np.sum(((b2 - m2) ** 2) * p2) / q2

但是这并不符合Python的编写风格,而且还存在另一个问题:

如果没有逗号怎么办?我的意思是如何拆分像这样的内容:

   v2 = np.sum(((b1 - m1) ** 2 * np.sum(((b2 - np.sum(((b2 - m2) ** 2) * p2) / q2) ** 2) * p2) / q2) * p1) 

数学上讲,以上内容并没有任何意义,只是为了解释我的意思。


2
可能是如何在Python中进行换行(行继续)?的重复问题。 - Burhan Khalid
2
@BurhanKhalid 我不同意,这个问题比一个简单的换行符要复杂得多。 - Jacqlyn
2个回答

7

反斜杠可以用来分割长行。

你可以自行选择在哪里进行分割,但是上面的行可以被改写成:

v2 = np.sum(((b1 - m1) ** 2 * \
        np.sum(((b2 - np.sum(((b2 - m2) ** 2) * p2) / q2) ** 2) * p2) \
                                                                / q2) * p1)

我会先尝试通过其他方式来减少代码量(例如重命名变量,使用其他模块,改变操作顺序)。


@user2357112正确指出,在未匹配的括号、方括号或花括号内分割代码时不需要反斜杠,因此上面的代码也可以像这样:

v2 = np.sum(((b1 - m1) ** 2 *
        np.sum(((b2 - np.sum(((b2 - m2) ** 2) * p2) / q2) ** 2) * p2)
                                                                / q2) * p1)

来自PEP 8的最大行长度

在Python中,首选的换行方式是使用括号、方括号和花括号内部的隐式行连续性。通过将表达式放在括号中进行换行,可以将长行分为多行。应该优先使用这种方式,而不是使用反斜杠进行行连续。


1
你实际上不需要反斜杠。未匹配的括号、方括号或大括号内部的换行符将被忽略。 - user2357112
@user2357112:说得好。我仍然在每个换行符中使用它们,这样就不必担心是否有封闭的(/ [/{来处理我的换行符。 - fgb
如果你在语义上合理的位置断开,通常在最大的“块”之间,那么很明显是否有适当的未匹配标记。PEP 8建议使用隐式行连续性而不是分号。 - user2357112
@user2357112:又一个很好的观点。我想现在是时候清理一些我的代码了 ;) - fgb

4

不要过于纠结于“Pythonic”的方式。更应关注你的代码是否易读、高效和可扩展。我认为以下是一个良好的“Pythonic”解决方案:

formula = lambda b, m, p, q: np.sum(((b - m) ** 2) * p) / q
v1, v2 = formula(b1, m1, p1, q1), formula(b2, m2, p2, q2)

这种方法的优点是您可以多次使用“公式”,并获得最短的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接