2024-09-24 22:25:14 发布
网友
*args和**kwargs到底是什么意思?
*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']
你如何有效地使用它们?
另外,我们使用它们来管理继承。
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)
它可能更常用于面向对象编程中,当您重写一个函数时,并且希望使用用户传入的任何参数调用原始函数。
实际上你不必叫他们args和kwargs,这只是一个惯例。是*和**发挥了魔力。
args
kwargs
*
**
Python的官方文档有a more in-depth look。
注意S.Lott's comment中很酷的一点,您还可以使用*mylist和**mydict调用函数来解压位置参数和关键字参数:
*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
0 1 2 3
另外,我们使用它们来管理继承。
这样Sub就不知道(或关心)超类初始化是什么。如果你意识到你需要改变超类,你可以不必在每个子类中操心细节就可以解决问题。
将
*args
和/或**kwargs
作为函数定义的参数列表中的最后一项允许该函数接受任意数量的参数和/或关键字参数。例如,如果要编写一个返回所有参数之和的函数,无论您提供多少,都可以这样编写:
它可能更常用于面向对象编程中,当您重写一个函数时,并且希望使用用户传入的任何参数调用原始函数。
实际上你不必叫他们
args
和kwargs
,这只是一个惯例。是*
和**
发挥了魔力。Python的官方文档有a more in-depth look。
注意S.Lott's comment中很酷的一点,您还可以使用
*mylist
和**mydict
调用函数来解压位置参数和关键字参数:将打印:
0 1 2 3
相关问题 更多 >
编程相关推荐