Pythonic分裂数学计算的方法

时间:2013-12-04 05:13:54

标签: python

我使用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

但这并不会让人感觉到更多的pythonic,还有另一个问题:

如果没有逗号怎么办?我的意思是我怎么能分开这样的东西:

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

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

2 个答案:

答案 0 :(得分:4)

反斜杠可用于分割长行。

你拆分的地方取决于你,但上面这行可以重新修改:

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's Maximum Line Length

  

包装长行的首选方法是使用Python的暗示   括号,括号和括号内的行继续。排长龙   可以通过包装表达式来分解多行   括弧。这些应该优先使用反斜杠   换行。

答案 1 :(得分: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)

这种方式的优点是您可以多次使用formula。你得到最短的字符串。