Python2函数定义中*args的*符号有什么作用?
Python 2函数形参前
*符号的功能与使用规则 在Python 2的函数定义场景下,形参名前标注的*是特殊的参数收集标记,你代码中*args的args是业界约定俗成的参数名,换成任意合法变量名都可以实现相同效果,具体作用和规则如下:
- 核心作用:自动收集函数调用时传入的所有多余位置实参,将这些参数按传入顺序打包为一个元组(tuple),赋值给
*后面的参数变量。
以你给出的代码为例,调用biggest_number(-10, -5, 5, 10)时,4个传入的数字会被打包为元组(-10, -5, 5, 10)赋值给args,函数内部直接调用max(args)/min(args)就能完成最值计算;调用smallest_number(-64, 72, 94, 61, 0)时传入了5个参数,同样会被全部收集到args元组中,不需要提前固定函数的入参个数。 - 位置限制:带
*的收集参数必须放在所有普通位置参数的后面,不能放在普通参数之前,否则会直接触发语法错误。比如def demo(*args, x):是非法写法,正确写法为def demo(x, *args):——此时第一个传入的位置实参会赋值给普通参数x,剩余的所有位置实参会被收集到args元组中。 - 和普通参数的差异:你代码中
distance_from_zero(arg)使用的是普通位置参数,调用时必须严格传入1个实参,多传、少传都会报错;而使用*args标记的函数,支持传入0到任意多个位置实参,没有固定入参数量的限制。
补充说明:这个
*标记仅负责收集位置传参的内容,函数调用时传入的关键字参数不会被它收集,关键字参数的收集是另一个标记**的功能,和你当前代码场景无关。
你可以用一小段测试代码直观验证效果:
def test_args(*args): print type(args) print args # 传入任意数量的位置参数测试 test_args(2, 4, 6, "test")
Python 2环境下运行输出为:
<type 'tuple'> (2, 4, 6, 'test')
内容的提问来源于stack exchange,提问作者NaveenKrishna
相关产品推荐
相关产品推荐

