初学python–谈谈我对*args和**kwargs的理解

目录:

1. 概括:什么*args和**kwargs
2. 进一步了解
3. *args参数的使用
4. **kwargs参数的使用
5. 参数x、*args、**kwargs的位置

tip:基于python3.5

1. 概括:什么*args和**kwargs
刚开始学python的时候,我发现好多项目中都有这两个参数,这到底是干嘛的呢?看着这几个**,我想起了C语言中的指针,陷入了深深的沉思…
查阅了一些资料,发现这两个参数的应用场景是:当我要传入的参数个数不定、长度不定时,可以使用这两个变量。

2. 进一步了解
叫做可变长参数列表,本质上是tuple和dict。重要的不是args和kwargs。重要的是*和**,哪怕是这么写:*amao和**agou。看下面的例子:

def function(*args, **kwargs):
    print("args", args, type(args))
    print("kwargs", kwargs, type(kwargs))
    print("="*40)

def function1(*amao, **agou):
    print("amao", amao, type(amao))
    print("agou", agou, type(agou))
    print("="*40)

function(1, b=2)
function1(3, b=4)

结果:

args (1,) <class 'tuple'>
kwargs {'b': 2} <class 'dict'>
========================================
amao (3,) <class 'tuple'>
agou {'b': 4} <class 'dict'>
========================================

 

3. *args参数的使用
*args是位置参数,按照位置传值。不光像上面说的,可以传可变长度的参数;同时还能接收剩余的参数,这里重点说后者。
例如:*args接收剩余的参数

def function(x, y, *args):
    print(x, y, args)
    print("=" * 40)

function(1, 2, 3, 4, 5)

结果:

1 2 (3, 4, 5)
========================================

 

例如:当*args参数位置不是最后一个时,也就是说*args参数后面还有一个参数的时候会是什么样?

def function(x, y, *args, z):
    print(x, y, args, z)
    print("=" * 40)

function(1, 2, 3, 4, 5)

结果就报错了:

TypeError: function() missing 1 required keyword-only argument: 'z'

 

这时候指定参数,z=6就不会报错了。

def function(x, y, *args, z=6):
    print(x, y, args, z)
    print("=" * 40)

function(1, 2, 3, 4, 5)

输出结果:

1 2 (3, 4, 5) 6
========================================

 

4. **kwargs参数的使用
**kwargs是可变的关键词参数列表。python中以dict类型展示出来。
这个参数的作用与上类似,可以接收边长参数,接收剩余参数。不同的是这个类型是字典。
举例:

def function(**kwargs):
    print(kwargs)
    print("=" * 40)

function(a=1, b=2, c=3)

结果:

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

接收剩余参数的例子:

def function(x, **kwargs):
    print(x, kwargs)
    print("=" * 40)

function(10, a=1, b=2, c=3)

结果:

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

如果我把x和**kwargs位置调换呢?

def function(**kwargs, x):
    print(x, kwargs)
    print("=" * 40)

function(a=1, b=2, c=3, 10)

结果报错了,说我语法错误:

def function(**kwargs, x):
^
SyntaxError: invalid syntax

5. 参数x、*args、**kwargs的位置
通过以上的例子我们还发现了一个问题,那就是位置问题,上面的两个例子中,将*args/**kwargs 和 参数x调换时,都报错了。
我们再试一下,参数x在前面,更换*args和**kwargs位置,会发生什么?

def function(x, **kwargs, *args):
    print(x, args, kwargs)
    print("=" * 40)

function(1, a=3, b=4, c=5, 6, 7)

结果报错了,又说我语法错误:

def function(x, **kwargs, *args):
^
SyntaxError: invalid syntax

通过以上的实验总结,参数x、*args、**kwargs三个参数的位置必须是一定的。必须是(x,*args,**kwargs)这个顺序。

One thought on “初学python–谈谈我对*args和**kwargs的理解”

发表评论

电子邮件地址不会被公开。 必填项已用*标注