使用 *args 和 **kwargs
使用 *args 和 **kwargs
这个问题已经有答案了:
所以我对*args
和**kwargs
这个概念很难理解。
到目前为止我学到的是:
*args
= 参数列表 - 作为位置参数**kwargs
= 字典 - 其中键成为各个关键字参数,值成为这些参数的值。
我不明白这对于编写程序有什么帮助。
可能是:
我认为这个可以同时作为函数的参数输入列表和字典,并且作为通配符,因此我可以传递任何参数?
有一个简单的例子来解释*args
和**kwargs
是如何使用的吗?
我找到的教程只使用了 \"*\" 和一个变量名。
*args
和**kwargs
只是占位符,还是你要在代码中使用*args
和**kwargs
?
admin 更改状态以发布 2023年5月21日
*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类。
语法是*
和**
。 名称*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
正如您在本例中看到的,它将列表(或元组)中的项目进行解包。通过这样做,它将它们与函数中的参数相匹配。当然,您可以在函数定义和函数调用中都使用*
。