当列表解包作为参数传递给带变量参数的函数时,它是如何工作的?

2024-09-26 17:58:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个计算可变参数表算术平均值的函数。它有一个位置参数和静止变量参数。代码如下所示。在

def mean(x, *l):
  sum = x
  for i in l:
     sum += i
  return sum / (1.0 + len(l))

现在我定义一个包含var参数的列表

^{pr2}$

现在我调用我的函数

mean(*z) which prints 2.5 which is correct.

那么这里发生了什么?我的理解是当我这么做的时候,它打开了列表。 但是它如何从列表中选择第一个位置参数,并保持列表的其余部分不变,以获得函数mean中定义的“l”的长度。它是否只是为了从z中提取第一个元素,然后保持z的其余部分不变?如果这可以用一个列表来完成,那怎么办?在

另外,如果我用z单独作为参数调用函数,它会抛出错误

阿里平均值(z) 回溯(最近一次呼叫): 文件“”,第1行,输入 “文件”,第5行,用ari表示 TypeError:不支持/:“list”和“float”的操作数类型

谢谢。在


Tags: 文件函数代码inwhich列表for参数
2条回答

运行下面的代码可以向您展示它是如何工作的,注释表示在函数中传递参数的方式。在

def mean(x, *l):
    sum=x
    print("x:",x)
    print("l:",l)
    print("len(l):",len(l))
    for i in l:
        sum += i
    return sum / (1.0+len(l))

z = [1,2,3,4]
print("1st call:")
print("result:",mean(*z))  ##x = z[0] and l=tuple(z[1:])
print("\n\n2nd call:")
print("result:",mean(z))  ##x = z and l = tuple()

调用mean(*z)时,Python解包{}是正确的,这意味着函数调用与调用mean(1, 2, 3, 4)等效(在本例中)

现在,进入问题的第二部分:

Did it unpack list z just to extract the 1st element from z then keeping rest of z as it is?

不是真的。首先,z被解包,每个参数分别传入(如上所述)。现在我们来看看均值的定义:def mean(x, *l):。此定义要求至少有一个位置参数(x),而不是任何数量的额外参数。因此,因为您对mean(*z)的初始调用变成了mean(1, 2, 3, 4),那么在mean内部,x等于{},而{}变成了元组(2, 3, 4)。在

Also, If I call the function with z alone as argument, it throws error

如果只使用z单独调用函数(mean(z)),那么,回到函数定义,x将是列表[1,2,3,4]l将是一个空元组。因为l是一个空的元组,所以for循环中什么都不会发生,您将到达最后一行return sum / (1.0 + len(l))。现在,因为x是一个列表,Python会引发一个异常,因为它不知道如何计算[1,2,3,4] / 1.0

相关问题 更多 >

    热门问题