Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇3:我如何使这个等式可读?_Python_Python 3.x_Integration_Readability_Code Readability - Fatal编程技术网

Python 蟒蛇3:我如何使这个等式可读?

Python 蟒蛇3:我如何使这个等式可读?,python,python-3.x,integration,readability,code-readability,Python,Python 3.x,Integration,Readability,Code Readability,因此,对于我正在进行的实习,我需要使用(x^(9/2))/(1-x)^2的积分作为我正在绘制的方程的一部分。然而,我沿着x轴绘制的变量出现在两个积分极限中。由于我是python的完全新手,我的代码非常糟糕,但我最终复制+粘贴了两次不定积分,插入了积分限制,并进行了减法运算。我怎样才能使代码更好 import numpy as np import matplotlib.pyplot as plt from scipy import integrate x = np.arange(0,2.5,0.

因此,对于我正在进行的实习,我需要使用(x^(9/2))/(1-x)^2的积分作为我正在绘制的方程的一部分。然而,我沿着x轴绘制的变量出现在两个积分极限中。由于我是python的完全新手,我的代码非常糟糕,但我最终复制+粘贴了两次不定积分,插入了积分限制,并进行了减法运算。我怎样才能使代码更好

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

x = np.arange(0,2.5,0.00001)

zs = 8
zr = 6
rbub = 5
sig = 2.5
XHI = 0.5
sigma = 10**-sig
L = 10**-3
zb = zs - (((1 + zs)/8)**(3/2)) * (0.0275) * (rbub/10)
a = (1+zr)/((1+zs)*(x+1))
b = (1+zb)/((1+zs)*(x+1))

def f(x):
    ans = 0.000140092
    ans = ans * ((1+zs)**(3/2))
    ans = ans * ((x+1)**(3/2))
    ans = ans * XHI
    return ans * ((9/2)*(np.log(1-np.sqrt(b)) - np.log(np.sqrt(b)+1)) + (1/35 * (1/(b-1)) * (10*(b**(9/2)) + 18*(b**(7/2)) + 42*(b**(5/2)) + 210*(b**(3/2)) - 315*(b**(1/2))) - ((9/2)*(np.log(1-np.sqrt(a)) - np.log(np.sqrt(a)+1)) + (1/35 * (1/(a-1)) * (10*(a**(9/2)) + 18*(a**(7/2)) + 42*(a**(5/2)) + 210*(a**(3/2)) - 315*(a**(1/2)))))))

使用好的变量名将对阅读代码的人甚至对您有很大帮助,注释也会有所帮助。
对于其他人来说,这是一个方程式,没有好的方法来表述。

这里有一个例子。当然,我不知道这是怎么回事。正如其他人指出的那样,您应该能够更好地添加注释/合理的变量名。不过,这里是你可以做的

首先,运行代码格式化程序,使代码更人性化

def f(x):

    ans = 0.000140092
    ans = ans * ((1 + zs) ** (3 / 2))
    ans = ans * ((x + 1) ** (3 / 2))
    ans = ans * XHI

    return ans * (
        (9 / 2) * (np.log(1 - np.sqrt(b)) - np.log(np.sqrt(b) + 1))
        + (
            1
            / 35
            * (1 / (b - 1))
            * (
                10 * (b ** (9 / 2))
                + 18 * (b ** (7 / 2))
                + 42 * (b ** (5 / 2))
                + 210 * (b ** (3 / 2))
                - 315 * (b ** (1 / 2))
            )
            - (
                (9 / 2) * (np.log(1 - np.sqrt(a)) - np.log(np.sqrt(a) + 1))
                + (
                    1
                    / 35
                    * (1 / (a - 1))
                    * (
                        10 * (a ** (9 / 2))
                        + 18 * (a ** (7 / 2))
                        + 42 * (a ** (5 / 2))
                        + 210 * (a ** (3 / 2))
                        - 315 * (a ** (1 / 2))
                    )
                )
            )
        )
    )
你马上就会看到一些符号。这块

10 * (b ** (9 / 2))
+ 18 * (b ** (7 / 2))
+ 42 * (b ** (5 / 2))
+ 210 * (b ** (3 / 2))
- 315 * (b ** (1 / 2))
是一些权重和a
b
提升为幂向量的点积。如果
b
是标量,我们可以把它写成
np.dot(权重,np.sqrt(b)**幂)
。也许我们甚至可以通过使用积分幂来获得一些优化点

把这些东西放在一起,我们可以得到如下结果:

weights = np.array([10, 18, 42, 210, -315])
powers = np.array([9, 7, 5, 3, 1])


def log_term(x):
    return (9 / 2) * (np.log(1 - np.sqrt(x)) - np.log(np.sqrt(x) + 1))


def dot_term(x):
    return (1 / 35) * 1 / (x - 1) * np.dot(np.sqrt(x)[..., None] ** powers, weights)


def integrate(x):
    return log_term(x) + dot_term(x)


factor1 = integrate(b) - integrate(a)
factor2 = 0.000140092 * ((1 + zs) ** (3 / 2)) * XHI
factor = factor1 * factor2


def f(x):
    return factor * ((x + 1) ** (3 / 2))
有了更好的变量名和注释,这几乎是可读的


旁白。在原始代码和此版本中,都可以在脚本主体中定义
x
。您还可以将多个变量定义为
x
的函数,例如
a
b


Python范围规则意味着,如果将不同的
x
传递给
f
,这些变量将不会更改。如果希望所有变量随
x
变化,则应将定义移到函数中。

关于如何改进现有工作代码的问题应引导编写一条单独的赋值语句,对定积分进行求值并将其存储在名称下,如
defintval=
。您可能还希望将其进一步分解为更小的步骤,以便可以使用更多的空格,这样表达式就不会在多个屏幕上滚动。您可以尝试将变量放入两个seprate列表中,并使用ZIP()对其进行迭代。第二个想法是把它们放在一个元组列表中,这些元组必须包含元素。感谢您提供的信息!欢迎来到堆栈溢出!如果您相信代码工作正常,请考虑以更完整的方式呈现您的工作(以单元测试)。你可能会得到一些建议,让它更有效,更容易阅读,更好地测试。在你这样做之前,请确保先阅读,因为有些事情在那里做得不同-例如,问题标题应该简单地说明代码的作用,因为问题总是“我如何改进它?”。因为我不同意“没有好的表达方式”,所以投了否决票。等式永远是一个等式,可能更像python,但很好,我可能确实把这句话解释为“没有好的表达方式”。:)好的变量名等确实是很好的实践,但这个问题是关于如何使等式更具可读性的,并且通过各种方法这是绝对可能的。否则,我会给出类似的答案。