在这篇文章中,我们将讨论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😀😀😀