“关键字参数”与常规参数有何不同?所有的参数不能被传递为name=value而不是使用位置语法吗?


当前回答

只需补充/添加一种方法来定义参数的默认值,当调用函数时,这些参数没有在关键字中赋值:

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

叫它:

print(func())
print(func(my_word='love'))

你会得到:

default_msg
love

阅读更多关于python中的*args和**kwargs的信息:https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

其他回答

我很惊讶没有人提到你可以混合位置参数和关键字参数,使用*args和**kwargs来做这样的鬼鬼祟祟的事情:

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

这允许您使用任意关键字参数,这些参数可能包含您不想在前面定义的键。

位置参数

它们前面没有关键词。顺序很重要!

func(1,2,3, "foo")

关键字参数

他们在前面有关键词。它们可以是任何顺序!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

您还应该知道,如果您使用默认参数而忽略了插入关键字,那么顺序将会很重要!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

有两个相关的概念,都称为“关键字参数”。

在调用端,也就是其他评论者提到的,您可以通过名称指定一些函数参数。您必须在所有没有名称的参数(位置参数)之后提到它们,并且对于任何根本没有提到的参数必须有默认值。

另一个概念是在函数定义方面:您可以定义一个按名称接受参数的函数——您甚至不必指定这些名称是什么。这些是纯关键字参数,不能按位置传递。语法是

def my_function(arg1, arg2, **kwargs)

传递给这个函数的任何关键字参数都将被放入一个名为kwargs的字典中。你可以在运行时检查这个字典的键,像这样:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

只需补充/添加一种方法来定义参数的默认值,当调用函数时,这些参数没有在关键字中赋值:

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

叫它:

print(func())
print(func(my_word='love'))

你会得到:

default_msg
love

阅读更多关于python中的*args和**kwargs的信息:https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

还有最后一个重要的语言特性。考虑以下函数:

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'}

这些特性很少被使用,但偶尔它们非常有用,知道哪些参数是位置参数或关键字是很重要的。