正常参数与关键字参数
“关键字参数”和普通参数有什么不同呢?难道所有的参数不都可以用 name=value
的方式来传递,而不需要用位置的方式吗?
10 个回答
131
使用关键字参数和普通参数是一样的,只是顺序不重要。举个例子,下面这两个函数调用是一样的:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
221
还有一个最后的语言特性,区分它们是很重要的。考虑下面这个函数:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
*positional
参数会存储传递给 foo()
的所有位置参数,而且你可以提供任意数量的参数。
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
**keywords
参数会存储任何关键字参数:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
当然,你也可以同时使用这两种参数:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
这些特性虽然不常用,但有时候非常有用,所以了解哪些参数是位置参数,哪些是关键字参数是很重要的。
401
这里有两个相关的概念,都叫做“关键字参数”。
首先是在调用函数的时候,正如其他评论者提到的,你可以通过名字来指定一些函数的参数。你需要在所有没有名字的参数(也叫位置参数)之后提到这些名字,并且对于那些没有提到的参数,必须有默认值。
另一个概念是在定义函数的时候:你可以定义一个函数,让它通过名字来接收参数——而且你甚至不需要指定这些名字是什么。这些就是纯粹的关键字参数,不能通过位置来传递。它的语法是
def my_function(arg1, arg2, **kwargs)
你传入这个函数的任何关键字参数都会被放到一个叫做kwargs
的字典里。你可以在运行时查看这个字典的键,像这样:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}