首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >print(*args,**kwargs) vs print("{},{}".format(*args,**kwargs))

print(*args,**kwargs) vs print("{},{}".format(*args,**kwargs))
EN

Stack Overflow用户
提问于 2015-03-22 16:17:13
回答 1查看 7K关注 0票数 1
代码语言:javascript
复制
>>> 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试图访问这个元组的第二个元素?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-22 18:53:50

不,这不是真的,如果这是真的话,您的代码将输出"((1) {})",因为args将是一个元组,1kwargs是一个空的dict (表示为{})。

通常,func(a,b)是用两个参数调用一个函数。这与用元组func((a,b))调用函数不同,您只使用一个参数调用该函数。

有时您想要编写函数,其中参数数目未知。您可以使用func(*args) (请注意,名称args不是必需的,而是约定)。任何前面有一个星号的名字都可以用语法来实现这一点。我们可以编写一个join()函数,它接受的不是字符串列表,而是任意数量的字符串作为参数:

代码语言:javascript
复制
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_()的定义)

代码语言:javascript
复制
>>>join_(*["first", "second", "third"])
"firstsecondthird"

因此,列表(或元组)前面的*将将列表的元素“推送”到函数的参数。**与关键字参数的字典是一样的。

那么你的例子是什么呢?让我们来看看foo1。它将所有参数吸收到一个名为args的列表中,然后再将这些参数推入打印函数中。所以你的电话foo1(1)print(1)打电话。foo2是做什么的?您的调用foo2(1)调用print("{} {}".format(1)) --您请求替换为值,但只提供了一个。还请注意,在任何地方都没有元组。小卡人怎么了?因为您没有指定关键字参数,所以它“消失了”。它甚至不是一个空字典,因为您可以验证:

代码语言:javascript
复制
>>>print(**{})

>>>print({})
{}

另外,您可以这样做:

代码语言:javascript
复制
def foo3(*args, **kwargs):
    print("{} {}".format(args, kwargs))

这永远不会引起一个例外:

代码语言:javascript
复制
>>> foo3()
() {}
>>> foo3("abc", "123")
('abc', '123') {}
>>>foo3("foo", c="bar")
('foo',) {'c': 'bar'}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29196745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档