容纳没有默认值的empy函数参数

时间:2018-10-12 20:20:45

标签: python-3.x

我正在python 3.6中编写一个简单的函数,以查找n维空间中两点之间的距离。我将坐标作为一维列表传递给函数。这是我写的:

def Distance(a: list[float], b: list[float]):
    dimension = len(a)
    sum = 0
    for i in range(dimension):
        sum += (b[i]-a[i])**2
    return math.sqrt(sum)

如果ab都被显式传递,那么这应该可以正常工作。但我想添加其他功能:如果仅传递a,将计算其与原点的距离。

在C ++中,我最熟悉的语言是使用函数重载来实现的。在这种情况下,这两个函数将仅具有不同数量的参数。但这不是我在Python中的选择。

任何对此的帮助将不胜感激。预先谢谢你。

编辑: 更新的定义

 def Distance(a: List[float], b=None):
    if b:
        arg = sum((x1 - x2)**2 for x1, x2 in zip(a,b))
    else:
        arg = sum(x**2 for x in a)
    return math.sqrt(arg)

适用于两种情况。

2 个答案:

答案 0 :(得分:1)

原型确实必须具有None,因此您必须更改函数类型,因为None显然不是列表:

def Distance(a: list[float], b=None):

然后:

if not b:
    b = [0.] * dimension

答案 1 :(得分:1)

惯用的定义可能是

def distance(a, b=None):
    from math import sqrt
    d2=sum((x1-x2)**2 for x1,x2 in zip(a,b)) if b else sum(x**2 for x in a))
    return sqrt(d2)

我相信也可以使用类型提示,但是我不是专家。

最后,您使用sum作为名称,但建议您不要掩盖内置名称(我在函数定义中使用了sum内置)