为什么有一个带有an_arg_name和* args作为参数的函数而不仅仅是* args

时间:2013-11-16 06:26:58

标签: python python-2.7

为什么有my_fun(an_arg, *arg)或者a_func(dict=None, **args)这样的函数为什么人们更喜欢这样做而不只是说my_func(*args)?我们不只是通过使用前者重复自己吗?

3 个答案:

答案 0 :(得分:2)

my_fun(an_arg, *arg)my_func(*args)之间存在差异。

my_fun(an_arg, *arg)

传递至少一个或多个参数。

my_func(*args)

传递任意数量的参数,甚至 0

<强>演示:

>>> def my_fun(an_arg, *arg):
    pass
... 
>>> def my_fun1(*arg):
    pass
... 
>>> my_fun()
... 
TypeError: my_fun() missing 1 required positional argument: 'an_arg'

>>> my_fun1(1) #works fine

答案 1 :(得分:2)

这有助于为您的功能提供更多意义。假设我正在尝试接受一个函数,该函数通过某个参数递增数字列表。这是一个愚蠢的例子来说明:

def increase(increment, *nums):
    return [num + increment for num in nums]

在这种情况下,第一个参数的作用以及它的用途非常清楚。相反,如果我们这样做:

def increase(*args):
    return [num + args[0] for num in args[1:]]

...然后我们不清楚我们在做什么,以及所有论据都做了什么。

此外,如果我们想要接收数据,转换数据并将其余参数传递给另一个函数,它也很有用。

这是另一个人为的例子:

def log(message, func, *args):
    print message
    func(*args)

再一次,如果我们只使用*args,我们的意思就不那么明确了:

def log(*args):
    print args[0]
    args[1](args[2:])

这会更容易出错,而且难以修改。如果没有足够的参数,它也会导致函数失败 - 通过第一种方式,你基本上使前两个元素成为必需元素,其余元素是可选的。

答案 2 :(得分:0)

它们不是等效形式。其他“重复”表单将参数绑定到谨慎参数,更重要的是,表明需要一些参数。尝试使用0个参数调用def my_fun(an_arg, *arg): pass

虽然谨慎(已知)参数在许多情况下都有效,*args允许"sequence-variadic"函数,**kwargs允许“参数 - 可变参数”函数。