函数参数的使用有两个方面值得注意:函数参数是如何定义的,以及函数调用过程中参数是如何解析的。
我们先来看第一个问题。在python中定义函数参数主要有四种方式:
1.F(arg1,arg2,...)
这是最常见的定义方式。一个函数可以定义任意数量的参数,每个参数用逗号分隔。以这种方式定义的函数在被调用时也必须在函数名后面的括号中提供相同的数字。 value(实参),并且顺序必须相同,也就是说在这个调用方法中,形参和实参的个数必须相同,并且必须一一对应,也就是说,第一个形参对应第一个形参。一个论点。例如:
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或n。请注意,无论有多少,它们都存储在函数内部的元组中,其参数名称是标识符。
>>> 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 "", line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument 'm'
4.F(**arg1)
在形参名前加两个 * 表示参数将与函数内部的形名标识符一起存储在字典中。这时候调用函数的方法需要使用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 "", line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)
上面介绍了这四种定义。接下来我们看看调用过程中函数参数是如何解析的。其实只要记住上面四种方法的优先级依次递减,先1,再2,再3,最后4。就是先解析模式1的arg,再解析模式2的arg=value ,然后解析方式3,即以arg的形式形成一个实参的元组,最后传递剩下的key。 =value 形式的实参形成一个字典,并以两个星号传递给形参,即模式 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 "", line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument 'y'
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python 3.4什么时候发布12/17
- ♥ 如何将python编译成exe文件08/14
- ♥ php和python有什么区别09/30
- ♥ 什么是 python 的自动化 GUI?如何使用?11/02
- ♥ 如何在python中输入时间08/25
- ♥ 如何用python写内容12/27
内容反馈