Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

*arge 接收的数据类型为tuple

**kwargs接收的数据类型为dict

当对象实例化时,如果有参数传入,则会传入**kwargs,如下面,user = User(name="bobby"), 调试中发现,args的tuple的值为0,无值传入。 而kwargs的值有传入{'name':'bobby'},即参数被传入了kwargs的dict中

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

当对象实例化时,如果无参数传入,则会传入*args,如下面,user = User("bobby"), 调试中发现,kwargs的dict为空,无值传入。即参数被传入了args的tuple中

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

一、*args的使用方法

      *args 用来将参数打包成tuple给函数体调用

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

二、**kwargs的使用方法

      **kwargs 打包关键字参数成dict给函数体调用

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

注意:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别 

如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;

如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs。

args和kwargs这两个标识符是约定俗成的用法,你当然还可以用*bob和**billy,但是这样就并不太妥。

下面是具体的示例:
Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

 Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

为什么提这个问题?

有时候,我们需要往函数中传入未知个数的参数或关键词参数。有时候,我们也希望把参数或关键词参数储存起来,以备以后使用。有时候,仅仅是为了节省时间。

*args 和 **kwargs 都代表 1个 或 多个 参数的意思。*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型。

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别

Python 高级编程和异步IO并发编程 --08_5 *arge 与 **kwargs的区别