初学Python的同学看到类似下面这样的函数都会比较迷惑,估计很多人会想难不成python也有指针和指向指针的指针?
-
def f(a, *pargs, **kargs):
-
print(a, pargs, kargs)
实际上这是python的很重要的一个特性,即arbitrary arguments。当你需要一个函数支持任意多个参数的时候,你就会用到它。上面例子中的那个函数,python会把匹配上的参数作为一个tuple(元祖)来处理。可以像下面这样调用函数f,python会把1匹配给参数a,把3, 'abc', ('lls', 'pow')匹配给pargs,
-
f(1, 3, 'abc', ('lls', 'pow'), param1 = 'A')
打印出来结果如下,
(1, (3, 'abc', ('lls', 'pow')), {'param1': 'A'})
可以看出pargs被用tuple (3, 'abc', ('lls', 'pow'))赋值。
类似的,前面出现两个星号的kargs会被用字典匹配,即所有像param = x这种格式的传入参数会被转成dict赋值给给kargs。
需要注意的是,在定义函数的时候**kargs这种类型的参数必须放在最后(如果有的话),而*pargs这种类型的参数必须放在**kargs这种类型参数的前面,其他类型参数的后面。
比如下面这几种定义都是非法的,
-
def f(a, *b, c=6, **d):
-
pass
-
def f(a, **b, *c):
-
pass
-
def f(*a, **b, c):
-
pass
-
def f(a, b, *c, **d, e):
-
pass
而下面这几种定义都是合法的
-
def f(a, **b):
-
pass
-
def f(a, *b):
-
pass
-
def f(*a, **b):
-
passs
-
def f(**a):
-
pass
-
def f(a, b=1, *c, **d):
-
pass
举一个实际一点的例子,写一个函数,输入任意多个数字作为参数,找到其中最大的一个,就可以利用我们提到的*pargs, 代码如下
-
def max(*pargs):
-
maxNum = pargs[0]
-
for i in pargs[1:]:
-
if i > maxNum:
-
maxNum = i
-
return maxNum
-
-
print max(5, 3, 1, 43, 54, 23, 1, 2, 32)
结果打印54。
阅读(2079) | 评论(0) | 转发(0) |