在这篇文章中,我们将讨论Python中的*arg和**kwargs以及它们的用途和一些例子。
当编写一个函数时,我们经常需要向函数传递值。这些值被称为函数参数。
函数参数的问题
首先,让我们在Python中定义一个两数字相加的函数。如下代码:
# 两数之和
def add(x, y):
return x + y
print(add(2, 3))
# 输出为5
如果你需要加三个数字呢?很简单,我们可以把这个函数修改为接受三个参数并返回它们的总和。
# 三数之和
def add(x, y, z):
return x + y + z
print(add(2, 3, 5))
# 输出 10
这不是很简单吗?是的,很简单!
此时,思考下,如果我们想定义一个4个数字之和的函数呢?想想你会怎么做
但如果我们再次被要求只加两个数字呢?我们修改后的函数能帮助我们得到总和吗?让我们来看看:
def add(x, y, z):
return x + y + z
print(add(2, 3))
输出:
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(add(2, 3))
TypeError: add() missing 1 required positional argument: 'z'
你看到问题所在了吗?修改后的函数add(x, y, z) 不支持只传递x,y 两个参数?
那问题就出现了!如何让函数可以以接受可变数量的参数数呢?
这就是*args和 **kwargs的用途。当你不确定参数的数量时,你可以使用*args和**kwargs作为函数的参数
*args 用法
*args允许我们向Python函数传递数量可变的非关键字参数。在函数中,我们应该在参数名称前使用星号 (*) 来传递可变数量的参数。如下代码:
def add(*args):
print(args, type(args))
add(2, 3)
输出为:
(2, 3) <class 'tuple'>
从输出可以看到args是tuple类型。
因此,我们确信传递的参数在函数内部组成了一个与参数同名的元组,但不包括*。
现在,让我们重写add()函数,让参数数量可变。
def add(*numbers):
total = 0
for num in numbers:
total += num
return total
print(add(2, 3))
print(add(2, 3, 5))
print(add(2, 3, 5, 7))
print(add(2, 3, 5, 7, 9))
输出:
5
10
17
26
注意,参数的名称不一定是args - 它可以是任何命名。在这个例子中是numbers。但一般来说,使用*args通常是一种标准的命名。
**kwargs 的用法
**kwargs允许我们向Python函数传递数量不定的关键字**参数。在这个函数中,我们使用双星号 (**)在参数名前表示这种类型的参数。
def total_fruits(**kwargs):
print(kwargs, type(kwargs))
total_fruits(banana=5, mango=7, apple=8)
输出:
{'banana': 5, 'mango': 7, 'apple': 8} <class 'dict'>
因此,我们看到,在这种情况下,参数被传递为一个字典,这些参数在函数中组成一个字典,其名称与参数相同,但不包括**。
现在,让我们完成total_fruits()函数,返回水果的总数:
def total_fruits(**fruits):
total = 0
for amount in fruits.values():
total += amount
return total
print(total_fruits(banana=5, mango=7, apple=8))
print(total_fruits(banana=5, mango=7, apple=8, oranges=10))
print(total_fruits(banana=5, mango=7))
输出:
20
30
12
注意,参数的名称不一定是kwargs - 同样,它可以是任何变量命名。在这个例子中,是**fruits。但一般来说,使用**kwargs通常是一种标准命名。
小节
在这篇文章中,我们介绍了Python中的两个特殊关键字 - *args 和 **kwargs。它们使Python函数变得灵活,让函数可以接受可变数量的参数和关键字参数。
感谢你的阅读! 欢迎大家点赞、收藏支持!
pythontip 出品,Happy Coding!
公众号: 夸克编程
我们的小目标:让天下人都会python😀😀😀