为什么有my_fun(an_arg, *arg)
或者a_func(dict=None, **args)
这样的函数为什么人们更喜欢这样做而不只是说my_func(*args)
?我们不只是通过使用前者重复自己吗?
答案 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
允许“参数 - 可变参数”函数。