如何在Python中使用*args和**kwargs

313 阅读3分钟

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

从输出可以看到argstuple类型。

因此,我们确信传递的参数在函数内部组成了一个与参数同名的元组,但不包括*

现在,让我们重写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😀😀😀