一、概述
1、python有位置参数、默认参数,这两种是最常用的参数。
2、动态参数即不限定参数个数,以一种动态的方式接受传参的个数。
3、python的动态参数有两种,分别是 ‘ *args ’ 和 ‘ **kwargs ’ 。他们区别在于是一个星号还是两个星号,而不是 args 和kwargs ,实际上定义成 ‘ *cat ’ 和 ‘ **dog’ 也是可以的,只是按照约定俗称的写法,通常写成 ‘ *args ’ 和 ‘ **kwargs ’。
4、注意:动态参数必须放在所有位置参数和默认参数后面!
二、一个星号
1、一个星号的动态参数表示接收任意个参数,调用时会将实际参数打包成一个元组传入。如果参数是个列表,则会将整个列表当成一个参数传入。
如图所示,动态参数传入的4,5,6会被打包成一个元组传入到函数内部。
2、如果当传入的动态参数是一个列表,则会将整个列表当成一个参数传入。
如图,传入的[4,5,6]被当成元组的中的一个元素传入了。如果想把列表也当成当个元素逐个传入呢?可以使用*传参!如下图所示。
在传参是添加一个*,就可将列表中的元素逐个传入。实际上所有序列类型的元素都可以是用这种方式传递,比如字符串、元组、字典、list等。
3、一个星号的特殊情况!
当一个星号的动态参数位于n个默认参数后面时,python会自动将一个星号的动态参数的前n个赋值为默认参数。
如图所示,默认将动态参数的4,5赋值给了c、d,这是python内部的传参规则。
三、两个星号
1、两个星号的动态参数,会将传入的参数打包成字典传给函数。
2、而如果当传入的动态参数是一个字典时,程序会报错。为了解决这个问题,可以使用两个*将字典值逐个传入。
3、两个星号的动态参数必须置于一个星号动态参数的后面!
四、万能参数 & 关键字参数
1、一个星号的动态参数 + 两个星号的动态参数 = 万能参数!
2、万能参数可能不受参数的个数限制,在灵活的同时也带了一些麻烦。
例如,我们在招聘的时候要求必须传入‘age’这个参数,就可以使用关键字参数进行限定。关键字参数使用 * 进行区别,即 * 号后面的内容都是关键字参数。
注意 :关键参数在调用时必须传参数名称。
3、对于动态参数里面的关键参数,不需要加 * ,直接在动态参数后面限定即可。
注意:关键参数必须要传,但是可以传空缺值。下面这种方式可以。
但下面这种方式就会报错。