普通参数与关键字参数

2024-04-23 17:30:05 发布

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

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


Tags: name参数value语法关键字常规
3条回答

使用关键字参数和普通参数是一样的,只是顺序无关紧要。例如,下面的两个函数调用是相同的:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

最后还有一个语言特征是区别很重要的。考虑以下功能:

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

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

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

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

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

def my_function(arg1, arg2, **kwargs)

传递给此函数的任何关键字参数都将放入名为kwargs的字典中。您可以在运行时检查此词典的键,如下所示:

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

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

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

相关问题 更多 >