jug*_*aut 3 python variables arguments list
我有一个函数来计算变量参数列表的算术平均值.它有一个位置参数和rest变量参数.所以代码如下所示.
def mean(x, *l):
sum = x
for i in l:
sum += i
return sum / (1.0 + len(l))
Run Code Online (Sandbox Code Playgroud)
现在我定义一个包含var参数的列表
z = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
现在我打电话给我的功能
mean(*z) which prints 2.5 which is correct.
Run Code Online (Sandbox Code Playgroud)
那么这里发生了什么?我的理解是当我做*z它解压缩列表z.但后来它如何从列表中选择第一个位置参数并保持列表的其余部分保持不变,以获得函数均值中定义的'l'的长度.它是否解压缩列表z只是从z中提取第一个元素然后保留z的其余部分?如果可以用列表完成那么如何?
另外,如果我单独使用z作为参数调用该函数,则会抛出错误
ari_mean(z)Traceback(最近一次调用last):文件"",第1行,在文件"",第5行,在ari_mean中TypeError:不支持的操作数类型为/:'list'和'float'
谢谢.
当你打电话时mean(*z),你的Python解包是正确的z,这意味着你的函数调用是等效的(在这种情况下),调用mean(1, 2, 3, 4)
现在,问题的第二部分:
它是否解压缩列表z只是从z中提取第一个元素然后保留z的其余部分?
并不是的.首先,z解压缩并且每个参数分别传递(如上所述).所以现在你看看平均值的定义:def mean(x, *l):.这个定义期望至少有一个位置参数(x),而不是任何数量的额外参数.所以,因为你的初始调用mean(*z)变成了mean(1, 2, 3, 4),然后在你的内部mean,x等于1并*l成为元组(2, 3, 4).
另外,如果我单独使用z作为参数调用该函数,则会抛出错误
如果你只用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