“args”和“kwargs”是什么意思?

2024-09-24 22:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

*args**kwargs到底是什么意思?

根据Python文档,从表面上看,它传递了一个元组参数。

def foo(hello, *args):
    print hello

    for each in args:
        print each

if __name__ == '__main__':
    foo("LOVE", ["lol", "lololol"])

打印出来:

LOVE
['lol', 'lololol']

你如何有效地使用它们?


Tags: 文档hellofor参数foodefargs表面
3条回答

另外,我们使用它们来管理继承。

class Super( object ):
   def __init__( self, this, that ):
       self.this = this
       self.that = that

class Sub( Super ):
   def __init__( self, myStuff, *args, **kw ):
       super( Sub, self ).__init__( *args, **kw )
       self.myStuff= myStuff

x= Super( 2.7, 3.1 )
y= Sub( "green", 7, 6 )

这样Sub就不知道(或关心)超类初始化是什么。如果你意识到你需要改变超类,你可以不必在每个子类中操心细节就可以解决问题。

*args和/或**kwargs作为函数定义的参数列表中的最后一项允许该函数接受任意数量的参数和/或关键字参数。

例如,如果要编写一个返回所有参数之和的函数,无论您提供多少,都可以这样编写:

def my_sum(*args):
    return sum(args)

它可能更常用于面向对象编程中,当您重写一个函数时,并且希望使用用户传入的任何参数调用原始函数。

实际上你不必叫他们argskwargs,这只是一个惯例。是***发挥了魔力。

Python的官方文档有a more in-depth look

注意S.Lott's comment中很酷的一点,您还可以使用*mylist**mydict调用函数来解压位置参数和关键字参数:

def foo(a, b, c, d):
  print a, b, c, d

l = [0, 1]
d = {"d":3, "c":2}

foo(*l, **d)

将打印:0 1 2 3

相关问题 更多 >