使用 *args 和 **kwargs

17 浏览
0 Comments

使用 *args 和 **kwargs

这个问题已经有答案了

**(双星号/星号)和*(星号)对于参数是做什么的?

所以我对*args**kwargs这个概念很难理解。

到目前为止我学到的是:

  • *args = 参数列表 - 作为位置参数
  • **kwargs = 字典 - 其中键成为各个关键字参数,值成为这些参数的值。

我不明白这对于编写程序有什么帮助。

可能是:

我认为这个可以同时作为函数的参数输入列表和字典,并且作为通配符,因此我可以传递任何参数?

有一个简单的例子来解释*args**kwargs是如何使用的吗?

我找到的教程只使用了 \"*\" 和一个变量名。

*args**kwargs只是占位符,还是你要在代码中使用*args**kwargs

admin 更改状态以发布 2023年5月21日
0
0 Comments

*args**kwargs非常有用的一个地方是用于子类化。

class Foo(object):
    def __init__(self, value1, value2):
        # do something with the values
        print value1, value2
class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
        # do something else, don't care about the args
        print 'myfoo'
        super(MyFoo, self).__init__(*args, **kwargs)

这样你可以扩展Foo类的行为,而不必了解太多关于Foo的知识。如果你正在编写一个可能会更改的API,这将非常方便。MyFoo只是将所有参数传递给Foo类。

0
0 Comments

语法是***。 名称*args**kwargs只是惯例,但并没有硬性要求使用它们。

当您不确定有多少参数可能被传递到函数中时,您可以使用*args,即它允许您向函数传递任意数量的参数。例如:

>>> def print_everything(*args):
        for count, thing in enumerate(args):
...         print( '{0}. {1}'.format(count, thing))
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage

类似地,**kwargs允许您处理您事先未定义的命名参数:

>>> def table_things(**kwargs):
...     for name, value in kwargs.items():
...         print( '{0} = {1}'.format(name, value))
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit

您也可以将这些与命名参数一起使用。显式参数首先获得值,然后将其余部分传递给*args**kwargs。命名参数在列表中排在首位。例如:

def table_things(titlestring, **kwargs)

您还可以在同一个函数定义中同时使用两者,但*args必须出现在**kwargs之前。

在调用函数时,您也可以使用***语法。例如:

>>> def print_three_things(a, b, c):
...     print( 'a = {0}, b = {1}, c = {2}'.format(a,b,c))
...
>>> mylist = ['aardvark', 'baboon', 'cat']
>>> print_three_things(*mylist)
a = aardvark, b = baboon, c = cat

正如您在本例中看到的,它将列表(或元组)中的项目进行解包。通过这样做,它将它们与函数中的参数相匹配。当然,您可以在函数定义和函数调用中都使用*

0