1.*args和**kwargs
我发现大多数Python新手很难搞清楚*args和**kwargs这两个魔法变量。那么他们到底是什么呢?首先我要说明,使用*args和**kwargs并不是必须的。只有*(星号)是必须的。你也可以写成*var和**vars。使用*args和**kwargs只是一种传统。让我们先来看看*args吧。
1.1 *args的使用
*args和**kwargs大多数时候被用在函数的声明中。*args和**kwargs允许你向函数传递可变数量的参数。也就是说当你不确定将会向函数传递多少个参数的时候你就可以使用这两个参数。*args被用来传递一个不确定长度的、非KV式的参数列表。看了这个例子你就明白了:
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_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允许你传递一个不确定长度的、KV式的参数给函数。如果你想在函数中处理这样的参数,你应该使用**kwargs。下面是一个使用**kwargs的例子:
def greet_me(**kwargs):
for key, value in kwargs.items():
print("{0} == {1}".format(key, value))
>>> greet_me(name="yasoob")
name == yasoob
你会发现我们在函数中操作了一个字典。你现在已经明白了**kwargs的基础用法,现在让我们来看看如何使用*args和**kwargs来调用一个函数并传递一个列表或字典作为参数。
1.3使用*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和常规参数的顺序:
如果你想在一个函数中同时使用他们仨,使用顺序是:
some_func(fargs, *args, **kwargs)
1.4使用他们的时机:
这真的要看你的需求来。最常见的使用案例是写函数装饰器时(将在本书另一章节中讨论修饰器)。还有就是当你希望在程序运行时修改某些代码的情况下使用这些参数。假如你有一个可以调用API并返回服务器响应的数据的类叫get_info
。如果我们想测试这个类的话,我们可以把对API的调用替换为一些用来测试的数据。例如:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info
我想你也一定还会发现其他用例。