Python函数参数中的*与**运算符

时间:2022-03-01 01:45:19

问题描述

在阅读某些代码时,经常会看到函数定义/调用时的参数前带有 * 或者 ** 运算符,比较糊涂,今天来探究记录一番.

函数定义时的 * 和 **

查阅相关资料得知,在参数前面加上* 号 ,意味着参数个数不止一个,而带一个星号(*)参数的函数传入的参数存储为一个元组(tuple),带两个(*)号则是表示字典(dict)!

我们定义3个函数来分别测试一下*和**的功能。

第一个函数func1参数列表中有两个参数,其中参数b前有*
第二个函数func2参数列表中有两个参数,其中参数b前有**
第三个函数func3参数列表中有三个参数,第二个参数前有*,第三个参数前有**

?
1
2
3
4
5
6
7
8
9
10
11
12
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)

然后我们进行参数传入

?
1
2
3
4
5
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时,程序则会报错,例如

?
1
2
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的值)类型的数据都适用。实验代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
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
}

我们使用*参数方式对其分别进行调用

?
1
2
3
4
5
6
7
8
9
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,而且变量名称要与函数定义的变量名称一致,实验代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 *与**运算符内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/u011426236/article/details/115442436