我有一个计算可变参数表算术平均值的函数。它有一个位置参数和静止变量参数。代码如下所示。在
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”的操作数类型
谢谢。在
运行下面的代码可以向您展示它是如何工作的,注释表示在函数中传递参数的方式。在
调用}是正确的,这意味着函数调用与调用
mean(*z)
时,Python解包{mean(1, 2, 3, 4)
等效(在本例中)现在,进入问题的第二部分:
不是真的。首先,},而{}变成了元组
z
被解包,每个参数分别传入(如上所述)。现在我们来看看均值的定义:def mean(x, *l):
。此定义要求至少有一个位置参数(x
),而不是任何数量的额外参数。因此,因为您对mean(*z)
的初始调用变成了mean(1, 2, 3, 4)
,那么在mean
内部,x
等于{(2, 3, 4)
。在如果只使用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
相关问题 更多 >
编程相关推荐