Python可变参数*args和**kwargs
本文我们将通过示例了解 Python函数的可变参数*args
和 **kwargs
的用法。
知识预备:Python 函数和 Python 函数参数在Python编程中,我们定义一个函数来生成执行类似操作的可重用代码。为了执行这个操作,我们调用一个具有特定值的函数,这个值在 Python 中称为函数参数。
函数示例 假设,我们定义了一个3个数相加的函数。
示例1: 用于加3个数字的函数
# 定义函数
def add(x, y, z):
print(f"总和: {x+y+z}")# 调用函数
add(10,12,13)
当我们运行上面的程序时,将会输出如下结果:
总和: 35
在上面的程序中,我们有三个参数 x,y 和 z 的加法函数。当我们在调用 add()函数传递三个值时,我们得到这三个数字的和作为输出。
接下来,让我们看看当我们在add()函数中传递超过3个参数时会发生什么。
# 定义函数
def add(x, y, z):
print(f"总和: {x+y+z}")# 调用函数
add(5,10,15,20,25)
当我们运行上面的程序时,输出将是
TypeError: add() takes 3 positional arguments but 5 were given
在上面的程序中,我们给add()函数传递了5个参数,而不是由于3个参数,并且得到 TypeError 错误。
这很显然不是我们想要的效果,那么应该怎么解决这个问题呢?
如果我们实际调用的时候,如果入参的个数是不确定的,就可以使用可变参数的语法来解决。
Python可变参数 在 Python 中,我们可以使用特殊符号向函数传递可变数量的参数。
有两个特殊的符号:
*args
:可变位置参数**kwargs
:可变关键字参数
*args
和 **kwargs
作为形式参数。Python *args 正如上面的例子一样,我们不确定可以传递给函数的参数数量。有
*args
,允许我们传递可变数量的非关键字参数到函数中。在函数定义中,我们应该在参数名之前使用星号
*
来传递可变长度的参数。参数以元组的形式传递,这些传递的参数在函数内部使用与参数(不包括星号 *)相同的名称构成元组。
例2: 使用
*args
将可变长度的参数传递给函数# 定义函数
def add(*num):
sum = 0
for n in num:
sum = sum + n
print(f"总和: {sum}")# 调用函数
add(3,5)
add(4,5,6,7)
add(1,2,3,5,6)
在上面的程序中,我们使用
*num
声明形式参数,它允许我们向 add()
函数传递可变长度的参数列表。在函数内部,我们有一个循环,它把传递的实际参数相加,并打印结果。注意,这里调用了3次,分别传递了不同的值,它们的长度可变,作为函数的实际参数。
当我们运行上面的程序时,输出将是:
总和: 8
总和: 22
总和: 17
Python **kwargs 对于传递关键字参数这个问题,Python 有一个名为
**kwargs
的解决方案,它允许我们将可变长度的关键字参数传递给函数。具体做法是,在函数中,我们在参数名之前使用双星号
**
来表示这种类型的参数。接收到的参数在函数内构成一个dict字典对象,其名称与参数(不包括两个星号
**
)相同。示例3: 使用
**kwargs
将可变关键字参数传递给函数# 定义函数
def intro(**data):print("实参的数据类型是:",type(data))for key, value in data.items():
print(f"{key} is {value}")# 调用函数
intro(name="小佛", age=30)
intro(city="深圳", lan="Python", hobby="干饭")
在上面的程序中,我们定义了一个以
**data
数据为形参的函数 intro ()。我们将两个长度可变的字典实参传递给 intro()
函数。我们
intro()
函数中使用for循环,它对传递字典的数据项进行处理,并输出字典的值。当我们运行上面的程序时,输出将是:
实参的数据类型是:
name:小佛
age:30
实参的数据类型是:
city:深圳
lan:Python
hobby:干饭
总结 值得注意的几点:
*args
和**kwargs
让函数变得非常灵活。*args
和**kwargs
是特殊的关键字,允许函数采用可变长度参数。*args
和**kwargs
是约定俗称的名称,可以自定义,例如*cat
,或者**dog
。*args
传递可变数量的位置参数,并且可以在其上执行元组的操作。**kwargs
传递可变数目的关键字参数,以便在其上执行字典的操作。
推荐阅读
- 腾讯会议-api 接口python3调用
- 备战蓝桥杯|【蓝桥Python每日一练】————砝码称重(状压DP)
- 树莓派文字转语音|树莓派文字转语音 python_基于树莓派的OTON眼镜(将文本转换为语音)
- python语音合成并播放_语音合成篇
- pytorch|升级pip超时python -m pip install --upgrade pip(终极解决)
- Python|python 利用pyttsx3文字转语音 适用于macOS windows树莓派
- 自然语言处理|Python 文字转语音(TTS)
- python|python递归实现全排列函数(代码+解析)
- pyhon反射
- #|送给小公主的一首诗——闪光屏幕书写(Python实现)