print(* args,** kwargs)vs print(“{},{}”。format(* args,** kwargs))

时间:2015-03-22 16:17:13

标签: python string

>>> 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尝试访问该元素的第二个元素元组?

1 个答案:

答案 0 :(得分:8)

不,这不是真的,如果这是真的,那么您的代码会输出"((1) {})",因为args将是一个带有1kwargs空字典的元组(表示为{})。

通常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),则第一个版本将无效,但只有第二个版本。明星"糟糕"参数到单个列表中。您可以找到文档here

如果有办法将参数提取到列表中,应该有一种方法将参数从列表中推送到函数参数中。而且有! (假设从上面定义join_()

>>>join_(*["first", "second", "third"])
"firstsecondthird"

所以在列表(或元组)前面的*将"推送"列表的元素输出到函数的参数。 **是相同的,只是使用关键字参数的字典。

那么你的例子是做什么的?让我们看看foo1。它将所有参数吸收到名为args的列表中,然后再将这些参数推出到print函数中。因此,您的通话foo1(1)会拨打print(1)foo2做了什么?您的来电foo2(1)来电print("{} {}".format(1)) - 您要求更换为值,但仅提供一个。另请注意,任何地方都没有元组。 ** kwargs怎么了?因为你没有指定关键字参数,所以"消失了#34;。它甚至不是一本空字典,你可以验证:

>>>print(**{})

>>>print({})
{}

另一方面,您可以这样做:

def foo3(*args, **kwargs):
    print("{} {}".format(args, kwargs))

永远不会引发异常:

>>> foo3()
() {}
>>> foo3("abc", "123")
('abc', '123') {}
>>>foo3("foo", c="bar")
('foo',) {'c': 'bar'}