1. *args 和 **kwargs
本文正在参加「Python主题月」,详情查看活动链接
我发现大多数新的 Python 程序员都很难弄清楚 *args 和 *kwargs 魔术变量。那么它们是什么?首先告诉你,args 或 kwargs 是没有必要写的。只有(星号)是必需的。你也可以写 *var 和 **vars。编写 *args 和 **kwargs 只是一个约定。所以现在让我们先来看看 *args 。
1.1. *args 的用法
*args 和 **kwargs 主要用于函数定义。*args 和 **kwargs 允许您将未指定数量的参数传递给函数,因此在编写函数定义时,您无需知道将传递给函数的参数数量。*args 用于向函数发送非关键字可变长度参数列表。这里有一个例子可以帮助你清楚地了解:
def test_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_args('yasoob', 'python', 'eggs', 'test')
这会产生以下结果:
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
我希望这消除了您的任何困惑。所以现在让我们来谈谈 **kwargs
1.2. **kwargs 的使用
**kwargs 允许您将关键字可变长度的参数传递给函数。如果要处理函数中的命名参数,应该使用 **kwargs 。这是一个让您继续使用它的示例:
def test_kwargs(**kwargs):
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
>>> test_kwargs(name="yasoob")
name = yasoob
所以你可以看到我们如何在我们的函数中处理关键字参数列表。这只是 **kwargs 的基础知识,你可以看到它是多么有用。现在让我们讨论如何使用 *args 和 **kwargs 来调用带有参数列表或字典的函数。
1.3. 使用 *args 和 **kwargs 调用函数
所以在这里我们将看到如何使用 *args 和 **kwargs 调用函数。想想你有这个小功能:
def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", arg2) print("arg3:", arg3) 现在您可以使用 *args 或 **kwargs 将参数传递给这个小函数。这是如何做到的:
# first with *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
**使用 *args kwargs 和正式 args 的顺序
所以如果你想在函数中使用所有这三个,那么顺序是
some_func(fargs, *args, **kwargs)
1.4. 什么时候使用它们?
这真的取决于你的要求是什么。最常见的用例是制作函数装饰器(在另一章中讨论)。此外,它还可以用于猴子修补。猴子补丁意味着在运行时修改一些代码。假设您有一个带有get_info调用 API 并返回响应数据的函数的类。如果我们想测试它,我们可以用一些测试数据替换 API 调用。例如:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info
我相信您也可以想到其他一些用例。