[python] *args, **kwargs 含义

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

猜你喜欢

转载自blog.csdn.net/ftell/article/details/80336540
今日推荐