>>> def foo1(*args, **kwargs):
... print(*args, **kwargs)
>>> def foo2(*args, **kwargs):
... print("{} {}".format(*args, **kwargs))
>> foo1(1)
1
>> foo2(1)
IndexError: tuple index out of range我的理解是正确的吗:*args, **kwargs实际上是一个元组,因为逗号使它成为一个,并且由于有两个占位符{},所以.format试图访问这个元组的第二个元素?
发布于 2015-03-22 18:53:50
不,这不是真的,如果这是真的话,您的代码将输出"((1) {})",因为args将是一个元组,1和kwargs是一个空的dict (表示为{})。
通常,func(a,b)是用两个参数调用一个函数。这与用元组func((a,b))调用函数不同,您只使用一个参数调用该函数。
有时您想要编写函数,其中参数数目未知。您可以使用func(*args) (请注意,名称args不是必需的,而是约定)。任何前面有一个星号的名字都可以用语法来实现这一点。我们可以编写一个join()函数,它接受的不是字符串列表,而是任意数量的字符串作为参数:
def join_(*args):
rv = ""
for _string in args:
rv += _string
return(rv)
>>> join_("first", "second", "third")
"firstsecondthird"
>>> join_(["first", "second", "third"])
TypeError: Can't convert 'list' object to str implicitly正如您所看到的,无论是用许多参数还是使用参数列表(或元组,因为这很重要),它们都是不同的。如果我们将它定义为def join_(args),那么第一个版本就不会起作用,而只是第二个版本。明星“吸”了一张单子上的争论。您可以找到文档这里。
如果有一种将参数拉到列表中的方法,那么应该有一种将参数从列表中推入函数参数的方法。而且确实有!(从上面假设join_()的定义)
>>>join_(*["first", "second", "third"])
"firstsecondthird"因此,列表(或元组)前面的*将将列表的元素“推送”到函数的参数。**与关键字参数的字典是一样的。
那么你的例子是什么呢?让我们来看看foo1。它将所有参数吸收到一个名为args的列表中,然后再将这些参数推入打印函数中。所以你的电话foo1(1)给print(1)打电话。foo2是做什么的?您的调用foo2(1)调用print("{} {}".format(1)) --您请求替换为值,但只提供了一个。还请注意,在任何地方都没有元组。小卡人怎么了?因为您没有指定关键字参数,所以它“消失了”。它甚至不是一个空字典,因为您可以验证:
>>>print(**{})
>>>print({})
{}另外,您可以这样做:
def foo3(*args, **kwargs):
print("{} {}".format(args, kwargs))这永远不会引起一个例外:
>>> foo3()
() {}
>>> foo3("abc", "123")
('abc', '123') {}
>>>foo3("foo", c="bar")
('foo',) {'c': 'bar'}https://stackoverflow.com/questions/29196745
复制相似问题