在Python中定义函数的时候,有时会看到输入参数中有*args和**kwargs,简单的说,它们都是用来存放输入的参数的,只不过存放的方式不一样。args以元祖的方式存放参数,kwargs以字典的方式存放。具体该怎么用可以看下面的一个简单的例子:
""" A simple example of *args and **kwargs.
Author: Meringue
Date: 2018/7/1
"""
"""
args: 以元祖的形式存放多个参数
kwargs:以字典的形式传递多个参数
"""
def fun1(*args):
print("args = ", args) # 存放了所有的参数
def fun2(x, *args):
print("x = ", x)
print("args = ", args) # 存放了除x外所有的参数
def fun3(x, y=1, *args):
print("x = ", x)
print("y = ", y)
print("args = ", args) # 存放了除x和y外所有的参数
def fun4(x, *args, y=1):
print("x = ", x)
print("y = ", y) # 保持默认值
print("args = ", args) # 存放了除参数x外的所有的参数
def fun5(**kwargs):
print("kwargs = ", kwargs) # 以字典格式存放了所有的参数
def fun6(x, **kwargs):
print("x = ", x)
print("kwargs = ", kwargs) # 以字典格式存放了除x外所有的参数
def fun7(x=1, **kwargs):
print("x = ", x)
print("kwargs = ", kwargs) # 以字典格式存放了所有的参数
def fun8(x, *args, **kwargs):
"""注意调用顺序
"""
print("x = ", x)
print("args = ", args)
print("kwargs = ", kwargs) # 以字典格式存放了所有的参数
if __name__ == "__main__":
print("fun1 result:")
fun1(1,2,3,4,5)
print("fun2 result:")
fun2(1,2,3,4,5)
print("fun3 result:")
fun3(1,2,3,4,5)
print("fun4 result:")
fun4(1,2,3,4,5)
print("fun5 result:")
fun5(x1=1, x2=2, x3=3, x4=4, x5=5) # 调用时需要指定变量名
print("fun6 result:")
fun6(x=1, x2=2, x3=3, x4=4, x5=5) # 需要给定x的值
print("fun7 result:")
fun7(x1=1, x2=2, x3=3, x4=4, x5=5) # 可以不指定x的值(缺省值)
print("fun8 result:")
fun8(1,2,3,x1=1, x2=2, x3=3) # x=1, args=(2,3), kwargs={"x1": 1, "x2": 2, "x3": 3}
运行的结果如下:
fun1 result:
args = (1, 2, 3, 4, 5)
fun2 result:
x = 1
args = (2, 3, 4, 5)
fun3 result:
x = 1
y = 2
args = (3, 4, 5)
fun4 result:
x = 1
y = 1
args = (2, 3, 4, 5)
fun5 result:
kwargs = {'x1': 1, 'x2': 2, 'x3': 3, 'x4': 4, 'x5': 5}
fun6 result:
x = 1
kwargs = {'x2': 2, 'x3': 3, 'x4': 4, 'x5': 5}
fun7 result:
x = 1
kwargs = {'x1': 1, 'x2': 2, 'x3': 3, 'x4': 4, 'x5': 5}
fun8 result:
x = 1
args = (2, 3)
kwargs = {'x1': 1, 'x2': 2, 'x3': 3}
相信对照上面的函数看输出的结果就能搞明白args和kwargs的用法了。