1、当调用函数时,会想函数传递参数值,主要分为两种参数:
1) 关键字参数,在函数被调用时,采用函数定义时的默认值(=标识)或者给其传递字典参数,通过**expression。
例如:
def complex(imag=1,real=2)://采用默认值的参数需要放到参数的最后面
print real,imag
complex(real=2,imag=3)
complex(imag=3)
complex(**{"real":3,"imag":5})//字典
//具体的*expression和**expression使用方法在后面介绍
2) 定位参数,定位参数通常被定义在函数参数列表的前面或者通过*expression表达式的迭代器过程传递参数。
例如:
def complex(imag,real)://采用默认值的参数需要放到参数的最后面
print real,imag
complex(3,5)
complex(*(2,5))
2、可变参数,*identifier以及**identifier
最近在看django wsgi源码的时候遇到可变参数即func(*args,**kwargs)的函数定义,开始有点模糊,不知道是神马意思,我们现在通过python官方函数手册来看看可变参数的使用方法:
给函数传递参数时,严格意义上传递的参数个数必须和函数定义式参数个数相同,否则会报错。但是有时我们定义函数时并不能提前知道参数的个数(就像c语言里面的printf函数),此时我们可以使用*或者**来传递可变参数:
1)带*的参数,会将剩下的参数以元组的形式传递给args参数:
def complex(a,b,*c)://采用默认值的参数需要放到参数的最后面
print a,b
print type(c)
print c
complex(1,2,3,4,5,6)
调用complex的结果如下:
1 2
<type 'tuple'>
(3,4,5,6)
从结果可以看出,函数将(3,4,5,6)作为元祖传给了参数c.
2) 带**的参数,会将剩下的参数以字典的形式传递给kargs:
def complex(a,**c)://采用默认值的参数需要放到参数的最后面
print a
print type(c)
print c
调用complex(1,c='abc',d='bcd')的结果:
1
<type 'dict'>
{'c': 'abc', 'd': 'bcd'}
从结果看出,函数将(c='abc',d='bcd')参数以字典的形式传递给c
3、*expression,**expression
1)如果*expression出现在函数调用中,此表达式的值必须是一个迭代器,会依次传递给位置参数。
有一种情况例外,如果*expression出现在一些关键词参数之后,那么在处理关键词参数传递之前,会先 处理*expression参数:
>>> def f(a, b): ... print a, b ... >>> f(b=1, *(2,)) 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2
从上面看出,当将关键字参数和*expression同时使用时会有不同的结果 。一个是(1 2),一个结果是(2 1)
2)如果**expression出现在函数调用中,表达式必须是一个映射,映射的内容,在传递过程中,会被当做关键字参数传递。当表达式中关键字和通常意义的关键字传递的key相同时,会提示TypeError 异常。
def f(a,b):
print a,b
f(**{'a'=123,'b'=456})
f(a=123,**{'a'=123,'b'=456})//会报TypeError