2

我正在编写一个一次性脚本来计算一些我正在运行的模拟的分析解决方案。

我想以一种根据其输入计算正确答案的方式实现一个函数。例如,假设我有以下数学方程式:

tmax = (s1 - s2) / 2 = q * (a^2 / (a^2 - b^2))

对我来说似乎很简单,我应该能够执行以下操作:

def tmax(s1, s2):
    return (s1 - s2) / 2

def tmax(a, b, q):
    return q * (a**2 / (a**2 - b**2))

我可能已经习惯了在 中写作julia,但我真的不想让这个脚本过于复杂。

4

2 回答 2

3

在像 C++ 这样的静态类型语言中,您可以根据输入参数类型(和数量)重载函数,但这在 Python 中实际上是不可能的。任何给定名称只能有一个函数。

可以做的是使用默认参数功能该函数中选择两个路径之一,例如:

def tmax(p1, p2, p3 = None):
    # Two-argument variant has p3 as None.

    if p3 is None:
        return (p1 - p2) / 2

    # Otherwise, we have three arguments.

    return (p1 * p1 / (p1 * p1 - p2 * p2)) * p3

如果您想知道为什么我将平方运算从 更改n ** 2n * n,那是因为后者更快(或者在过去的某个时候至少对于像这样的小积分幂而言,它是更快的2- 这可能仍然是这种情况,但你可能要确认)。

一个可能g1 ** 2比执行更快的情况g1 * g1g1全局而不是本地(Python VM 需要更长的时间LOAD_GLOBAL而不是LOAD_FAST)。发布的代码并非如此,因为该参数本质上是非全局的。

于 2020-01-16T00:48:52.670 回答
1

您可以使用可选参数来执行此操作:

def tmax_2(s1, s2):
    return (s1 - s2) / 2

def tmax_3(a, b, q):
    return q * (a**2 / (a**2 - b**2))

def tmax(a, b, c=None):
    if c is None:
        return tmax_2(a, b)
    else:
        return tmax_3(a, b, c)
于 2020-01-16T00:44:45.750 回答