Python *与**运算符 Python函数参数中的*与**运算符
12345611654123 人气:0问题描述
在阅读某些代码时,经常会看到函数定义/调用时的参数前带有 * 或者 ** 运算符,比较糊涂,今天来探究记录一番.
函数定义时的 * 和 **
查阅相关资料得知,在参数前面加上* 号 ,意味着参数个数不止一个,而带一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)!
我们定义3个函数来分别测试一下*和**的功能。
第一个函数func1参数列表中有两个参数,其中参数b前有*
第二个函数func2参数列表中有两个参数,其中参数b前有**
第三个函数func3参数列表中有三个参数,第二个参数前有*,第三个参数前有**
def func1(a, *b): print(a) print(b) def func2(a, **b): print(a) print(b) def func3(a, *b, **c): print(a) print(b) print(c)
然后我们进行参数传入
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),
加载全部内容