python基础之*args与**kwargs

python基础之*args**kwargs简单介绍

认识 *args和 **kwargs

首先,看看*args**kwargs到底是个什么:
代码示例:

1
2
3
4
5
6
7
8
9
def foo(*args, **kwargs):
print(u"args = ", args)
print(u"kwargs = ", kwargs)
print("==============我是分割线==================")


if __name__ == '__main__':
foo(1, 2, 3, 4)
foo(a=1, b=2, c=3)

输出结果为:

1
2
3
4
5
6
args =  (1, 2, 3, 4)
kwargs = {}
==============我是分割线==================
args = ()
kwargs = {'a': 1, 'b': 2, 'c': 3}
==============我是分割线==================

可以看出,这俩其实就是python的两个变量,*args是个元组(tuple),**kwargs是个字典(dictionary)。

原理

通过google各种解释,差不多是理解了,其实*args**kwargs真正起作用的是***,而args以及kwargs其实就类似于varvars;当python需要传递多个参数时,就将参数放在一个元组里,按照参数位置传递,以*开头;当需要传递多个键值对时,就把这些键值对放在一个字典里,按照关键字传递,以**开头。

示例一:

1
2
3
4
5
6
7
def foo(x, *args):
print(x)
print(args)


if __name__ == '__main__':
foo(1, 2, 3, 4)

输出结果:

1
2
1
(2, 3, 4)

可以看出,python将(1,2,3,4),其中1,赋给默认参数x,(2,3,4)作为一个元组赋给args;

示例二:

1
2
3
4
5
6
7
def foo(x, **kwargs):
print(x)
print(kwargs)


if __name__ == '__main__':
foo(1, a=2, b=3, c=4)

输出结果:

1
2
1
{'a': 2, 'b': 3, 'c': 4}

python将(1, a=2, b=3, c=4),其中1,赋值给默认参数x;(a=2, b=3, c=4)作为字典赋给kwargs。

实参角度

或者从实参角度来理解:
*args示例:

1
2
3
4
5
6
7
8
def foo(x, y, z):
print(x)
print(y)
print(z)


if __name__ == '__main__':
foo(*(1, 2, 3))

输出结果:

1
2
3
1
2
3

可以看出python将*(1, 2, 3),按照位置将值赋给了x, y, z;

**kwargs示例:

1
2
3
4
5
6
7
8
def foo(x, y, z):
print(x)
print(y)
print(z)


if __name__ == '__main__':
foo(**{"x":1,"y":2,"z":3})

输出结果:

1
2
3
1
2
3

python将**{"x":1,"y":2,"z":3},按照关键字x,y,z赋值给了x,y,z。

*args其实可以理解为python需要调用的任意个没有关键字的参数(无名参数)组成的元组,
称之为Non-keyword Variable Arguments
**kwargs是python需要调用的任意个关键字参数(键值对)组成的字典,
称之为keyword Variable Arguments

注意事项

位置参数,*args,**kwargs混合使用顺序

当函数参数中同时拥有位置参数*args以及**kwargs时,顺序必须是位置参数,*args,**kwargs,否则会报错。
示例:

1
2
3
4
5
6
7
8
def foo(x, *args, **kwargs):
print(x)
print(args)
print(kwargs)


if __name__ == '__main__':
foo(1,2,3,4,a=1, b=2, c=3)

输出结果:

1
2
3
1
(2, 3, 4)
{'a': 1, 'b': 2, 'c': 3}

位置参数,默认参数,**kwargs混合使用顺序

当需要同时使用位置参数,默认参数以及**kwargs时,顺序必须为位置参数,默认参数,**kwargs,否则会报错。
示例:

1
2
3
4
5
6
7
8
def foo(x, y=2, **kwargs):
print(x)
print(y)
print(kwargs)


if __name__ == '__main__':
foo(1,3,a=1,b=2,c=3)

输出结果:

1
2
3
1
3
{'a': 1, 'b': 2, 'c': 3}

其中,3将赋给y,替换默认值2。

文章目录
  1. 认识 *args和 **kwargs
  2. 原理
  3. 实参角度
  4. 注意事项
    1. 位置参数,*args,**kwargs混合使用顺序
    2. 位置参数,默认参数,**kwargs混合使用顺序
|