一、概述

1、python有位置参数、默认参数,这两种是最常用的参数。

2、动态参数即不限定参数个数,以一种动态的方式接受传参的个数。

3、python的动态参数有两种,分别是 ‘ *args ’  和 ‘ **kwargs ’ 。他们区别在于是一个星号还是两个星号,而不是 args 和kwargs  ,实际上定义成 ‘ *cat ’ 和 ‘ **dog’ 也是可以的,只是按照约定俗称的写法,通常写成  ‘ *args ’  和 ‘ **kwargs ’。

4、注意:动态参数必须放在所有位置参数和默认参数后面!

二、一个星号

1、一个星号的动态参数表示接收任意个参数,调用时会将实际参数打包成一个元组传入。如果参数是个列表,则会将整个列表当成一个参数传入。

getopt python3 短参数 python *参数_getopt python3 短参数

 如图所示,动态参数传入的4,5,6会被打包成一个元组传入到函数内部。

2、如果当传入的动态参数是一个列表,则会将整个列表当成一个参数传入。

getopt python3 短参数 python *参数_开发语言_02

 如图,传入的[4,5,6]被当成元组的中的一个元素传入了。如果想把列表也当成当个元素逐个传入呢?可以使用*传参!如下图所示。

getopt python3 短参数 python *参数_元组_03

 在传参是添加一个*,就可将列表中的元素逐个传入。实际上所有序列类型的元素都可以是用这种方式传递,比如字符串、元组、字典、list等。

3、一个星号的特殊情况!

当一个星号的动态参数位于n个默认参数后面时,python会自动将一个星号的动态参数的前n个赋值为默认参数。

getopt python3 短参数 python *参数_开发语言_04

如图所示,默认将动态参数的4,5赋值给了c、d,这是python内部的传参规则。

三、两个星号

1、两个星号的动态参数,会将传入的参数打包成字典传给函数

getopt python3 短参数 python *参数_getopt python3 短参数_05

 2、而如果当传入的动态参数是一个字典时,程序会报错。为了解决这个问题,可以使用两个*将字典值逐个传入

getopt python3 短参数 python *参数_开发语言_06

 3、两个星号的动态参数必须置于一个星号动态参数的后面!

四、万能参数 & 关键字参数

1、一个星号的动态参数  + 两个星号的动态参数 = 万能参数!

2、万能参数可能不受参数的个数限制,在灵活的同时也带了一些麻烦。

例如,我们在招聘的时候要求必须传入‘age’这个参数,就可以使用关键字参数进行限定。关键字参数使用 * 进行区别,即 * 号后面的内容都是关键字参数

getopt python3 短参数 python *参数_getopt python3 短参数_07

注意 :关键参数在调用时必须传参数名称。

3、对于动态参数里面的关键参数,不需要加 * ,直接在动态参数后面限定即可。

getopt python3 短参数 python *参数_默认参数_08

 注意:关键参数必须要传,但是可以传空缺值。下面这种方式可以。

getopt python3 短参数 python *参数_getopt python3 短参数_09

 但下面这种方式就会报错。

getopt python3 短参数 python *参数_默认参数_10