时间:2021-05-23
在阅读某些代码时,经常会看到函数定义/调用时的参数前带有 * 或者 ** 运算符,比较糊涂,今天来探究记录一番.
查阅相关资料得知,在参数前面加上* 号 ,意味着参数个数不止一个,而带一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)!
我们定义3个函数来分别测试一下*和**的功能。
第一个函数func1参数列表中有两个参数,其中参数b前有*
第二个函数func2参数列表中有两个参数,其中参数b前有**
第三个函数func3参数列表中有三个参数,第二个参数前有*,第三个参数前有**
然后我们进行参数传入
func1(1, 2, 3, 4)print("---"*24)func2(1, x=1, y=2)print("---"*24)func3(1, 2, 3, 4, x=5, y=6)打印结果为:
$python3 main.py
(2, 3, 4)
------------------------------------------------------------------------
1
{'x': 1, 'y': 2}
------------------------------------------------------------------------
1
(2, 3, 4)
{'x': 5, 'y': 6}
可以看到,第一个函数将多余1个的后续参数全部以元组形式赋值给了带*参数b,第二个函数则将多余参数以字典形式赋值给了带**参数b,当*和**同时存在时,一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)。
如果这里我们不使用赋值形式传入参数来调用func2时,程序则会报错,例如
func2(1, 2, 3, 4)print("---"*24)将会有如下报错信息:
Traceback (most recent call last):
File "main.py", line 18, in <module>
func2(1, 2, 3, 4)
TypeError: func2() takes 1 positional argument but 4 were given
在调用时,*主要是用来解压参数列表,对于set、tuple、list、dict(会取其values的值)类型的数据都适用。实验代码如下:
def func4(a, b): print(a) print(b)params_set = (1, 2)params_tuple = (1, 2)params_list = [1, 2]params_dict = { "a": 1, "b": 2}我们使用*参数方式对其分别进行调用
print("***"*24)func4(*params_set)print("***"*24)func4(*params_tuple)print("***"*24)func4(*params_list)print("***"*24)func4(*params_dict)print("***"*24)打印结果如下:
************************************************************************
1
2
************************************************************************
1
2
************************************************************************
1
2
************************************************************************
a
b
************************************************************************
可以看到,*将参数按顺序一一赋值(set并无顺序,因此盲猜结果是随机的,未实验验证),而dict类型则是将字典的keys作为函数参数进行赋值。
**参数方式则要求输入必须是一个dict,而且变量名称要与函数定义的变量名称一致,实验代码如下:
params_dict1 = { "a": 1, "b": 2}params_dict2 = { "x": 1, "y": 2}print("---"*24)func4(**params_dict1)print("---"*24)func4(**params_dict2)打印结果如下:
------------------------------------------------------------------------
1
2
------------------------------------------------------------------------
Traceback (most recent call last):
File "main.py", line 57, in <module>
func4(**params_dict2)
TypeError: func4() got an unexpected keyword argument 'x'
可以看到,当变量名称与函数定义的变量名称不一致时,程序会报错
Python函数中参数前带*和**是什么意思?
Execute Python-3 Online (Python v3.6.2),
到此这篇关于Python函数参数中的*与**运算符的文章就介绍到这了,更多相关Python *与**运算符内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如+和|)或一元运算符(如-和~)。说得宽泛一些,在Python中,函数调
在这篇文章中,我们将介绍如下内容:==运算符与基元类型==运算符与引用类型==运算符与String类型==运算符与值类型==运算符与泛型==运算符与基元类型
使用...运算符定义变长参数函数(PHP5>=5.6.0,PHP7)现在可以不依赖func_get_args(),使用...运算符来实现变长参数函数。以上例程会
运算符重载实质上是函数的重载重载运算符的函数一般格式如下:函数类型operator运算符名称(形参表列){对运算符的重载处理}例如,想将“+”用于Complex
值与引用参数之间的区别:在C#中,既可以通过值也可以通过引用传递参数。在调用环境中通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的