Python 3.x 适应无默认值的empy函数参数

Python 3.x 适应无默认值的empy函数参数,python-3.x,Python 3.x,我正在用Python3.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) 如果a和b都被显式传递,这应该可以正常

我正在用Python3.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)
如果
a
b
都被显式传递,这应该可以正常工作。但是我想添加额外的功能:如果只传递了
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)

这两种情况都适用。

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

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


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

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


惯用的定义可以是

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
内置名称)

可以使用惯用定义

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
builtin)

这将适用于距离原点的距离,但对于第一种情况,如果我确实希望传递两个非零坐标,该怎么办?解释器不反对将列表作为第二个参数传递给具有此定义的函数吗?不,为什么会有问题?我们不把它限制为任何类型。这对于距离原点的距离是有效的,但是对于第一种情况,我确实想要传递两个非零坐标,那又如何呢?解释器不反对将列表作为第二个参数传递给具有此定义的函数吗?不,为什么会有问题?我们没有将其限制为任何类型。