* 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'] 

你如何有效地使用它们?

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

例如,如果你想写一个返回所有参数总和的函数,不pipe你提供了多less个参数,你可以这样写:

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

它可能在面向对象编程中更常用,当你重写一个函数,并且想用用户传入的任何参数来调用原始函数。

你实际上不必称他们为kwargs ,这只是一个惯例。 这是***做魔术。

官方的Python文档有一个更深入的外观 。

另外,我们使用它们来pipe理inheritance。

 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不知道(或关心)超类的初始化是什么。 如果你意识到你需要改变超类,那么你可以修复这些东西,而不必为每个子类中的细节出汗。

注意**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

另一个好用的*args**kwargs :你可以定义通用的“全部捕获”函数,这对装饰器来说是非常好的,因为你返回这样一个包装器而不是原来的函数。

一个简单的caching修饰器的例子:

 import pickle, functools def cache(f): _cache = {} def wrapper(*args, **kwargs): key = pickle.dumps((args, kwargs)) if key not in _cache: _cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache return _cache[key] # read value from cache functools.update_wrapper(wrapper, f) # update wrapper's metadata return wrapper import time @cache def foo(n): time.sleep(2) return n*2 foo(10) # first call with parameter 10, sleeps foo(10) # returns immediately 

只是为了澄清如何解决争议,并照顾缺失的论点等。

 def func(**keyword_args): #-->keyword_args is a dictionary print 'func:' print keyword_args if keyword_args.has_key('b'): print keyword_args['b'] if keyword_args.has_key('c'): print keyword_args['c'] def func2(*positional_args): #-->positional_args is a tuple print 'func2:' print positional_args if len(positional_args) > 1: print positional_args[1] def func3(*positional_args, **keyword_args): #It is an error to switch the order ie. def func3(**keyword_args, *positional_args): print 'func3:' print positional_args print keyword_args func(a='apple',b='banana') func(c='candle') func2('apple','banana')#It is an error to do func2(a='apple',b='banana') func3('apple','banana',a='apple',b='banana') func3('apple',b='banana')#It is an error to do func3(b='banana','apple') 

看看这个http://agiliq.com/blog/2012/06/understanding-args-and-kwargs/

正是你想要的,我猜