时间:2021-05-17 python教程 查看: 833
在阅读某些代码时,经常会看到函数定义/调用时的参数前带有 * 或者 ** 运算符,比较糊涂,今天来探究记录一番.
查阅相关资料得知,在参数前面加上* 号 ,意味着参数个数不止一个,而带一个星号(*)参数的函数传入的参数存储为一个元组(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
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
func4(**params_dict2)
TypeError: func4() got an unexpected keyword argument 'x'
可以看到,当变量名称与函数定义的变量名称不一致时,程序会报错
Python函数中参数前带*和**是什么意思?
Execute Python-3 Online (Python v3.6.2),
到此这篇关于Python函数参数中的*与**运算符的文章就介绍到这了,更多相关Python *与**运算符内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!