- 引:在c++中通过声明参数模板可以实现不定长参数的函数,在python中有更加方便的方式实现函数形参不定长的,那就是通过*号来实现。具体地可以分为两类,下面分别总结阐述。
- 本文主要参考和代码测试了该博文
- 第一类:在函数定义时使用 * 和 ** 。在函数定义时形参中 使用 * 和 **则表示 可以输入不确定具体参数个数的参数。
- 通过 * 声明的参数在调用是可以传入0~n个参数,且不管传入的参数为何类型,在函数内部都将其打包存放在以形参名为标识符的tuple中,无法进行修改。
- 同理,通过**声明的参数也是可以传入多个参数,但是传入的参数类型需要为k1=v1,k2=v2…的类型,且参数在函数内部将被存放在以形式名为标识符的dictionary中,这种方法在需要声明多个默认参数的时候特别有用。
- 当然*args与**kwargs可以一起使用,但要注意*args要写在前面。
- 小结:在函数定义时形参使用*或**目的时为了将输入的形参进行打包,只是出关键词外的参数打包成一个tuple变量,各关键字打包成一个dictionary变量。这样函数的形参是可以变长的。
- 通过 * 声明的参数在调用是可以传入0~n个参数,且不管传入的参数为何类型,在函数内部都将其打包存放在以形参名为标识符的tuple中,无法进行修改。
- 第二类:函数调用时形参变量加上*或**。表示将输入的 集合(序列)类型变量拆开(可见此时传入的是可迭代的容器对象)。
- 函数调用时参数变量前加*。
从上图可以看出函数调用时变量前加*可以解包各种容器类型变量:包括字典类型,值得注意的是此时字典只会将key解包并参与运算。 - 函数调用参数时加上**,作用也是将传入的参数拆开,只是输入的参数必须为字典,且每个 key 必须要为函数的某个形参,key对应的value为该参数的值。见下图,该方法可用于将要输入的参数打包成字典,再通过字典解包到函数中。
- 函数调用时参数变量前加*。
- 第一类与第二类的结合使用
- 定义函数和调用函数同时使用*,其实就时解包,再打包到args的过程:
- 同理,定义函数与调用函数同时使用**,也是解包再打包过程
- 定义函数和调用函数同时使用*,其实就时解包,再打包到args的过程:
- 总结:有人会有疑问,尤其是在最后的例子中,同时使用第一类和第二类,先解包在打包,这样做是不是又回去了,没有意义?其实不是,这样做的根本目的时保证函数的形参的长度是可变的。
python中星号(*和**)
最新推荐文章于 2023-11-10 09:46:16 发布