Python函数的参数

函数定义中从形式上看存在四种形式的参数:

位置参数:

tupleSqeArgs(arg1[,arg2])```
1
2

默认参数:```def tupleSqeArgs([arg1,[arg2,]] arg3='defaultB')

元组参数:

tupleVarArgs([arg1, [arg2
1
2

字典参数:```def dictVarArgs([arg1, [arg2='defaultB', [*nkw,]]] **kw)

[]内的内容是可选的。

按照python核心编程中的定义,参数的分类是这样的

  • 形式参数
    • 位置参数
    • 默认参数
  • 可变长度的参数
    • 非关键字可变长参数(元组)
    • 关键字变量参数(字典)

感觉读起来是不是很绕口且不容易记忆(反正我记不着后面两个),本文结合自己的一些实验,按照自己的记忆和学习习惯,将python函数的参数重新分为如下三类:

  1. 位置参数
  2. 元组参数
  3. 关键词参数

Note:Python的函数参数需要从函数定义函数调用两个方向理解。

1 位置参数

调用时需要按照函数定义中参数的出现顺序进行调用。

默认参数:一种特殊的位置参数:默认参数必须出现在位置参数之后,函数调用时可以不对默认参数传值。

1
2
3
4
def tupleSqeArgs(arg1,arg2, arg3='defaultB'): 
print 'formal arg 1:', arg1
print 'formal arg 2:', arg2
print 'formal arg 3:', arg3

调用方式如下:

1
2
3
4
tupleSqeArgs(1,2)
tupleSqeArgs(1,2,3)
tupleSqeArgs(arg1=1,arg2=2) #可以理解为关键词参数
tupleSqeArgs(arg1=1,arg2=2,arg3=3) #可以理解为关键词参数

2 元组参数(Tuple)

元组保存了所有传递给函数的”额外”的参数(匹配了所有位置和具名参数后剩余的)。函数定义中,所有的元祖参数必须在位置参数之后,且只能有一个。

1
2
3
4
5
def tupleVarArgs(arg1, arg2='defaultB', *nkw): 
print 'formal arg 1:', arg1
print 'formal arg 2:', arg2
for eachXtrArg in nkw:
print 'another arg:', eachXtrArg,type(eachXtrArg)

调用方法如下:

1
2
3
4
5
tupleVarArgs('abc')  #len(nkw) == 0
tupleVarArgs(23, 4.56) #len(nkw) == 0
tupleVarArgs('abc', 123, 'xyz', 456.789) #len(nkw) == 2,nkw==('xyz', 456.789)
t = ('xyz', 456.789)
tupleVarArgs('abc', 123, *t) #len(nkw) == 2,nkw==('xyz', 456.789)

3 关键词参数(Dictionary)

在我们有不定数目的或者额外集合的关键字的情况中, 参数被放入一个字典中,字典中键为参数名,值为相应的参数值。

1
2
3
4
5
def dictVarArgs(arg1, arg2='defaultB', **kw):
print 'formal arg1:', arg1
print 'formal arg2:', arg2
for eachXtrArg in kw.keys():
print 'Xtra arg %s: %s' % (eachXtrArg, str(kw[eachXtrArg]))

调用方式为:

1
2
3
4
5
6
7
8
9
10
11
dictVarArgs(1220, 740.0, c='grail') 
dictVarArgs(arg2='tales', c=123, d='poe', arg1='mystery')

d = {'arg1': 'mystery',
'arg2': 'tales',
'c': 123,
'd': 'poe'}
dictVarArgs(**d)

d = {'c': 123,'d': 'poe'}
dictVarArgs('mystery','tales', **d)

4 位置参数&元组参数&关键词参数共同出现时

1
2
3
4
5
6
7
def dictVarArgs(arg1, arg2='defaultB',*nkw, **kw):
print 'formal arg1:', arg1
print 'formal arg2:', arg2
for eachXtrArg in nkw:
print 'another arg:', eachXtrArg,type(eachXtrArg)
for eachXtrArg in kw.keys():
print 'Xtra arg %s: %s' % (eachXtrArg, str(kw[eachXtrArg]))

合法的调用方法如下:

1
2
dictVarArgs(123, 567,'tales', 'mys',c=123, d='poe') 
# 元组参数('tales', 'mys')必须出现在具名参数(关键词参数)之前,在位置参数之后

非法调用如下:

1
2
dictVarArgs(123, arg2=567,'tales', 'mys',c=123, d='poe') 
# 这种调用方法arg2=567,认为arg2时关键词参数。元组参数出现在了关键词参数之后,调用失败。