介绍
编程时,您可能不会意识到代码的所有可能的用例,并且可能希望为将来的程序员使用该模块或与代码交互的用户提供更多选项。 我们可以通过在我们的代码中使用*args
和**kwargs
,将可变数量的参数传递给函数。
理解*
在Python中, *args
的单星号形式可以用作将非关键字变长参数列表发送到函数的参数。 值得注意的是,星号( *
)是这里的重要元素,因为这个词是已经建立的传统习语,虽然它不被语言强制执行。
我们来看一个使用两个参数的典型函数:
def multiply(x, y):
print (x * y)
在上面的代码中,我们使用x
和y
作为参数来构建函数,然后当我们调用函数时,我们需要使用数字来对应x
和y
。 在这种情况下,我们将传递x
的整数5
和y
的整数4
:
def multiply(x, y):
print (x * y)
multiply(5, 4)
现在我们可以运行上面的代码:
python lets_multiply.py
我们将收到以下输出,显示整数5和4根据multiply(x,y)
函数multiply(x,y)
:
Output20
如果以后我们决定要增加三个数字而不是两个数字呢? 如果我们尝试在函数中增加一个数字,如下所示,我们会收到一个错误。
def multiply(x, y):
print (x * y)
multiply(5, 4, 3)
OutputTypeError: multiply() takes 2 positional arguments but 3 were given
因此,如果您怀疑以后可能需要使用更多的参数,则可以使用*args
作为*args
。
我们可以基本上创建与第一个示例中所显示的相同的函数和代码,通过将x
和y
作为函数参数,将其替换为*args
:
def multiply(*args):
z = 1
for num in args:
z *= num
print(z)
multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)
当我们运行这个代码时,我们会收到每个这些函数调用的产品:
Output20
90
24
900
因为我们使用*args
向我们的函数发送一个可变长度的参数列表,所以我们能够传入尽可能多的参数,我们希望进入函数调用。
通过*args
您可以创建更灵活的代码,在函数中接受不同数量的非关键字参数。
了解** kwargs
**kwargs
的双星号形式用于将关键字,可变长度的参数字典传递给函数。 再次,两个星号( **
)是这里的重要元素,因为通常使用kwarg这个词,虽然不是由语言强制执行的。
像*args
, **kwargs
可以提供许多你想提供的参数。 但是, **kwargs
与*args
有所不同,因为您需要分配关键字。
首先,我们简单地列出我们传递给函数的**kwargs
参数。 我们将创建一个简短的功能:
def print_kwargs(**kwargs):
print(kwargs)
接下来,我们将使用传递给函数的一些关键字参数来调用该函数:
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)
我们来运行上面的程序并查看输出:
python print_kwargs.py
Output{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}
因为字典数据类型是无序的,所以我们按照随机顺序接收了键值对,但是重要的是要注意,一个名为**kwargs
的字典被创建,我们可以使用它,就像我们可以使用其他字典一样。
让我们再创建一个简短的程序来展示如何使用**kwargs
。 在这里,我们将创建一个函数来打开名称字典。 首先,我们将从一个两个名字的字典开始:
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(my_name="Sammy", your_name="Casey")
我们现在可以运行该程序并查看输出:
python print_values.py
OutputThe value of your_name is Casey
The value of my_name is Sammy
再次,因为词典是无序的,您的输出可能是首先以Casey
或名称Sammy
的名字。
现在让我们传递额外的参数给函数,以表明**kwargs
会接受你想包括的许多参数:
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(
name_1="Alex",
name_2="Gray",
name_3="Harper",
name_4="Phoenix",
name_5="Remy",
name_6="Val"
)
当我们运行这个程序时,我们会收到以下输出,这个输出是无序的:
OutputThe value of name_2 is Gray
The value of name_6 is Val
The value of name_4 is Phoenix
The value of name_5 is Remy
The value of name_3 is Harper
The value of name_1 is Alex
使用**kwargs
为我们提供了在我们的程序中使用关键字参数的灵活性。 当我们使用**kwargs
作为参数时,我们不需要知道我们最终将要传递给一个函数的参数。
订购参数
在函数或函数调用中对参数进行排序时,必须以特定的顺序发生参数:
- 正式的位置论证
-
*args
- 关键字参数
-
**kwargs
实际上,当使用明确的位置参数以及*args
和**kwargs
时,您的函数将如下所示:
def example(arg_1, arg_2, *args, **kwargs):
...
而且,除了*args
和**kwargs
之外,使用位置*args
以及命名关键字*args
时,您的函数将如下所示:
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):
...
创建函数时要牢记参数的顺序很重要,以免您在Python代码中收到语法错误。
在函数调用中使用* args和** kwargs
我们也可以使用*args
和**kwargs
将*args
传递给函数。
首先,我们来看一个*args
的例子。
def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
args = ("Sammy", "Casey", "Alex")
some_args(*args)
在上面的函数中,有三个参数定义为arg_1
, arg_
和arg_3
。 该函数将打印出每个参数。 然后,我们创建一个设置为可迭代(在这种情况下是一个元组 )的变量,并可以将该变量传递到具有星号语法的函数中。
当我们使用python some_args.py
命令运行程序时,我们将收到以下输出:
Outputarg_1: Sammy
arg_2: Casey
arg_3: Alex
我们也可以将上面的程序修改为具有不同变量名称的可迭代列表数据类型 。 我们还将*args
语法与命名 *args
相结合:
def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
my_list = [2, 3]
some_args(1, *my_list)
如果我们运行上述程序,它将产生以下输出:
Outputarg_1: 1
arg_2: 2
arg_3: 3
类似地,关键字的**kwargs
参数可以用于调用函数。 我们将设置一个等于具有3个键值对的字典的变量(我们将在这里使用kwargs
,但可以调用任何您想要的),并将其传递给具有3个参数的函数:
def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
print("kwarg_1:", kwarg_1)
print("kwarg_2:", kwarg_2)
print("kwarg_3:", kwarg_3)
kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)
让我们用python some_kwargs.py
命令运行上面的程序:
Outputkwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy
调用函数时,可以使用*args
和**kwargs
来传递参数。
结论
我们可以在函数定义中使用*args
和**kwargs
的特殊语法,以便将可变数量的参数传递给函数。
创建接受*args
和**kwargs
的函数最适用于您希望参数列表中的输入数量保持相对较小的情况。 使用*args
和**kwargs
主要是为了提供可读性和便利性,但应该小心。