Python 函数可以以如下形式定义:
def fun(p, *args, **kwargs): # 3种参数出现的顺序固定
pass
p
为positional argument (位置参数)
*args
表示数量未知的一组positonal arguments。
**kwargs
表示数量未知的一组keyword arguments (关键字参数)
作为函数参数, p
, args
, kwargs
任意两个都不能交换顺序, 例如不能写成 :
fun(p, **kwargs, *args) #ERROR!
args
, kwargs
名称其实是无所谓的,决定语法的仅为 *
, **
, 以args
, kwargs
为参数名称只是一种传统,Python并无要求,改成其他名称也是允许的。
*args
*args
表示传入函数的参数数目是可变的。可以传 list
, 也可以传 tuple
, 如果事先不知道到底要传多少个参数给函数,定义函数时形参就可以写成*args
, 例如:
def f(*args):
for each in args:
print(each, end=' ')
mylist = [1, 2, 3, 4]
mytuple = ('x', 'y', 0)
f(*mylist) # 传入任意列表
print('')
f(*mytuple) # 传入任意元组
print('')
f('a', 8, 9) # 或者直接传任意数目的位置参数
# 1 2 3 4
# x y 0
# a 8 9
**kwargs
以dictionary
形式传入预先未定义的任意数目的命名参数:
def f(**kwargs):
for item in kwargs.items():
print(item) # 打印元组 tuple
mydict = {'x':'111', 'y':234}
f(**mydict)
# ('x', '111')
# ('y', 234)
也可以这样使用:
def f(x=1, y=2):
print(x, ' ', y)
mydict = {'x':0, 'y':1111}
f(**mydict)
# 0 1111
或者:
def f(**kwargs):
for k, v in kwargs.items():
print('{} = {}'.format(k,v))
f(x='124', y=876, z='000') # x, y, z都不能加引号:'keyword can't be expression'
# x = 124
# z = 000
# y = 876
3种形式的参数可以在函数参数表中同时使用。
[1]https://stackoverflow.com/questions/1769403/understanding-kwargs-in-python
[2]https://stackoverflow.com/questions/287085/what-do-args-and-kwargs-mean
[3]https://stackoverflow.com/questions/3394835/args-and-kwargs
[4]https://stackoverflow.com/questions/36901/what-does-double-star-asterisk-and-star-asterisk-do-for-parameters