Python函数参数传递机制详解:位置、默认、可变长与关键字参数
本文深入解析Python中函数参数的四种定义方式:位置参数、默认参数、可变长度参数(*args)及关键字参数(**kwargs)。详细阐述调用时的解析优先级与顺序,通过代码示例说明各参数类型的行为特征及常见错误,帮助开发者掌握Python函数调用的核心机制。
Python函数参数传递机制概述
在Python中,函数参数的使用主要涉及两个核心方面:
1. 函数参数的定义规则
2. 调用函数时参数的解析过程
Python函数参数的四种定义方式
首先探讨第一个问题,Python中函数参数的定义主要包含以下四种方式:
1.F(arg1,arg2,...)
这是最基础且常见的定义方式。一个函数可以定义任意数量的参数,各参数之间以逗号分隔。在调用此类函数时,必须在函数名后的括号内提供与形参数量完全一致的实际参数(实参),且传入顺序必须与定义顺序严格对应。即形参与实参在数量和顺序上必须一一对应,第一个形参对应第一个实参。例如:
def a(x,y):
print x,y
调用该函数时,若执行a(1,2),则x被赋值为1,y被赋值为2,形参与实参正确对应。如果调用a(1)或a(1,2,3),则会因参数数量不匹配而报错。
2.F(arg1,arg2=value2,...)
这是第一种方式的改进版,引入了默认参数值。
def a(x,y=3):
print x,y
调用该函数时,若执行a(1,2),x取1,y取2;若仅执行a(1),则不会报错,此时x仍为1,而y自动采用默认值3。此外,这两种方式均支持通过关键字指定参数位置,例如a(y=8,x=3)也是合法的调用形式。
3.F(*arg1)
前两种方式的形参数量是固定的,但在实际开发中,有时无法确定传入参数的具体个数。此时第三种方式尤为有用,它通过以单个星号(*)加上形参名的方式来接收不定数量的实参,实参个数可以为0个或多个。需要注意的是,无论传入多少个实参,在函数内部它们都会被封装在一个以该形参名为标识符的元组(tuple)中。
>>> def a(*x):
if len(x)==0:
print 'None'
else:
print x
>>> a(1)
(1,) #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)
Traceback (most recent call last):
File "<pyshell#16>", line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument 'm'
4.F(**arg1)
在形参名前添加两个星号(**)表示该参数用于接收关键字参数。函数内部会将这些参数封装在一个以形参名为标识符的字典(dictionary)中。此时,调用函数时必须采用arg1=value1, arg2=value2的形式进行传参。
>>> def a(**x):
if len(x)==0:
print 'None'
else:
print x
>>> a()
None
>>> a(x=1,y=2)
{'y': 2, 'x': 1} #存放在字典中
>>> a(1,2) #这种调用则报错
Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)
函数调用时的参数解析顺序与示例
上述介绍了四种参数定义方式。接下来分析函数在调用过程中参数的解析逻辑。只需记住这四种方法的解析优先级依次降低:首先解析方式1中的位置参数,其次解析方式2中的关键字赋值参数,接着解析方式3中剩余的位置参数(组成元组tuple),最后将剩余的关键字参数(组成字典dictionary)传递给带两个星号的形参(方式4)。
>>> def test(x,y=1,*a,**b):
print x,y,a,b
>>> test(1)
1 1 () {}
>>> test(1,2)
1 2 () {}
>>> test(1,2,3)
1 2 (3,) {}
>>> test(1,2,3,4)
1 2 (3, 4) {}
>>> test(x=1,y=2)
1 2 () {}
>>> test(1,a=2)
1 1 () {'a': 2}
>>> test(1,2,3,a=4)
1 2 (3,) {'a': 4}
>>> test(1,2,3,y=4)
Traceback (most recent call last):
File "<pyshell#52>", line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument 'y'
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









