擅长:python、mysql、java
<p>调用<code>mean(*z)</code>时,Python解包{<cd2>}是正确的,这意味着函数调用与调用<code>mean(1, 2, 3, 4)</code>等效(在本例中)</p>
<p>现在,进入问题的第二部分:</p>
<blockquote>
<p>Did it unpack list z just to extract the 1st element from z then keeping rest of z as it is?</p>
</blockquote>
<p>不是真的。首先,<code>z</code>被解包,每个参数分别传入(如上所述)。现在我们来看看均值的定义:<code>def mean(x, *l):</code>。此定义要求至少有一个位置参数(<code>x</code>),而不是<em>任何数量的额外参数</em>。因此,因为您对<code>mean(*z)</code>的初始调用变成了<code>mean(1, 2, 3, 4)</code>,那么在<code>mean</code>内部,<code>x</code>等于{<cd11>},而{<cd12>}变成了元组<code>(2, 3, 4)</code>。在</p>
<blockquote>
<p>Also, If I call the function with z alone as argument, it throws error</p>
</blockquote>
<p>如果只使用z单独调用函数(<code>mean(z)</code>),那么,回到函数定义,<code>x</code>将是列表<code>[1,2,3,4]</code>,<code>l</code>将是一个空元组。因为<code>l</code>是一个空的元组,所以for循环中什么都不会发生,您将到达最后一行<code>return sum / (1.0 + len(l))</code>。现在,因为<code>x</code>是一个列表,Python会引发一个异常,因为它不知道如何计算<code>[1,2,3,4] / 1.0</code></p>