当前位置: 首页 > 面试题库 >

使用* args,** kwargs和可选/默认参数调用Python函数

利稳
2023-03-14
问题内容

在python中,我可以定义一个函数,如下所示:

def func(kw1=None,kw2=None,**kwargs):
   ...

在这种情况下,我可以将func称为:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

我还可以将函数定义为:

def func(arg1,arg2,*args):
    ...

可以称为

func(3,4,additional,arguments,go,here,Ellipsis)

最后,我可以结合两种形式

def func(arg1,arg2,*args,**kwargs):
    ...

但是,不起作用的是调用:

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in python 2 only,  apparently this works in python 3)
    ...

我最初的想法是,这可能是因为一个函数

def func(arg1,arg2,*args,kw1=None):
    ...

可以称为

func(1,2,3) #kw1 will be assigned 3

因此,这将在将3打包到args还是kwargs中引入一些歧义。但是,在python 3中,可以指定仅关键字参数:

def func(a,b,*,kw=None):  #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
   ...

这样看来,在以下方面似乎没有语法歧义:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

但是,这仍然会引发语法错误(已通过Python3.2测试)。有没有我想念的原因?并且,有没有一种方法可以得到我上面描述的行为(具有带默认参数的*
args)-我知道我可以通过操纵函数中的kwargs字典来模拟这种行为。


问题答案:

可以 在Python 3中做到这一点。

def func(a,b,*args,kw1=None,**kwargs):

*仅当您要指定仅关键字参数 而不使用 接受可变数量的位置参数时,才使用裸露*args。您不用两个*

引用语法,在Python
2中
,您有

parameter_list ::=  (defparameter ",")*
                    (  "*" identifier [, "**" identifier]
                    | "**" identifier
                    | defparameter [","] )

而在Python
3中

parameter_list ::=  (defparameter ",")*
                    (  "*" [parameter] ("," defparameter)*
                    [, "**" parameter]
                    | "**" parameter
                    | defparameter [","] )

其中包括在参数之后提供其他参数的规定*

更新:

最新的Python
3文档在这里。



 类似资料:
  • 问题内容: 在 Python的2.x的 (我用2.7),这是使用默认参数用正确的方式和? 我已经找到了与此主题相关的SO问题,但这是针对 Python 3的 : 使用 args,* kwargs和可选的/默认参数调用Python函数 在那里,他们说此方法有效: 在2.7中,结果为。有没有推荐的方法来定义这种功能? 我以这种方式工作,但我猜有更好的解决方案。 问题答案: 只需将默认参数放在: 现在,

  •   *args 和 **kwargs 都允许将可变数量的参数传递给函数。当不确定要在函数中传递的参数数量时,将使用它们。   *args 允许你将可变数量的参数传递给函数。 def addNumbers(*numbers):     sum = 0     for number in numbers:         sum = sum + number     print("Sum: "

  • 问题内容: Python-使用args和*kwargs[副本] 问题答案: 1650 语法为和。名称和仅是约定,但没有使用它们的硬性要求。 你会使用,当你确定不是多少个参数可能会被传递给你的函数,也就是说,它允许你传递的参数任意数量给你的函数。例如: 同样,允许你处理尚未预先定义的命名参数: 你也可以将它们与命名参数一起使用。显式参数首先获取值,然后将其他所有值传递给argsand *kwargs

  • 本文向大家介绍Python函数中*args和**kwargs来传递变长参数的用法,包括了Python函数中*args和**kwargs来传递变长参数的用法的使用技巧和注意事项,需要的朋友参考一下 单星号形式(*args)用来传递非命名键可变参数列表。双星号形式(**kwargs)用来传递键值可变参数列表。 下面的例子,传递了一个固定位置参数和两个变长参数。 结果如下: 这个例子用来展示键值对形式的

  • 问题内容: 是否可以为可选的通用参数提供默认值? 我正在尝试做这样的事情: 但我说错了 这只是我试图做的不可能的事吗? 问题答案: 用您完成的方式是不可能的。仅考虑上述代码,什么是类型?就像它说的那样,编译器无法弄清楚(我也不能,因为数据不存在,我也不能。) 特定问题的解决方案是重载而不是使用默认值: 但这引发了您在这里做什么的问题。您会认为应该如此。否则,您在做什么?如果不诉诸(您应该强烈避免)

  • 当我将firstThing(第一件事)设置为default(默认值)时,如果没有默认值nil(默认值),这将起作用,我会得到一个错误,即调用函数时缺少参数。 通过键入Int 我认为它使它成为可选的,默认值为零,对吗?如果是这样,为什么没有=nil它就不能工作?