函数定义中带星号的变量的默认初始化

Posted

技术标签:

【中文标题】函数定义中带星号的变量的默认初始化【英文标题】:Default Initialization of Starred Variables within the Definition of a Function 【发布时间】:2016-12-20 01:21:09 【问题描述】:

众所周知,为了在 Python 中为函数内的变量设置默认值,使用以下语法:

def func(x = 0):
    if x == 0:
        print("x is equal to 0")
    else:
        print("x is not equal to 0")

所以如果函数是这样调用的:

>>> func()

结果

'x is equal to 0'

但是,例如,当对加星号的变量使用类似的技术时,

def func(*x = (0, 0)):

它会导致语法错误。我也尝试通过(*x = 0, 0) 来切换语法,但遇到了同样的错误。是否可以将星号变量初始化为默认值?

【问题讨论】:

这个问题可能对你有帮助:***.com/questions/15301999/… 【参考方案1】:

星型变量是非标准变量,旨在允许具有任意长度的函数

*variables 是一个包含所有位置参数的元组(通常命名为 args)

**variables 是一个包含所有命名参数的字典(通常命名为 kwargs )

他们会一直在那里,如果没有提供,就只是空的。您可以根据参数的类型测试值是否在字典或元组中并对其进行初始化。

def arg_test(*args,**kwargs):
   if not args:
      print "* not args provided set default here"
      print args
   else:
      print "* Positional Args provided"
      print args


   if not kwargs:
      print "* not kwargs provided set default here"
      print kwargs
   else:
      print "* Named arguments provided"
      print kwargs

#no args, no kwargs
print "____ calling with no arguments ___"
arg_test()

#args, no kwargs
print "____ calling with positional arguments ___"
arg_test("a", "b", "c")

#no args, but kwargs
print "____ calling with named arguments ___"
arg_test(a = 1, b = 2, c = 3)

【讨论】:

嗯。毕竟我想我想多了,谢谢! args 和 kwargs 最初也让我有些困惑 :)【参考方案2】:

默认情况下,带星号的变量的值为空元组()。虽然由于加星参数的工作方式而无法更改该默认值(tl;dr:Python 分配未加星标的参数,如果有的话,并将其余参数收集在一个元组中;您可以阅读有关它们的更多信息,例如在相关PEP 3132:https://www.python.org/dev/peps/pep-3132/) 你可以在函数的开头执行检查,以确定 x 是否是一个空元组,然后相应地更改它。您的代码将如下所示:

def func(*x):
    if x == ():  # Check if x is an empty tuple
        x = (0, 0)
    if x == 0:
        print("x is equal to 0")
    else:
        print("x is not equal to 0")

【讨论】:

以上是关于函数定义中带星号的变量的默认初始化的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

如何在Python中定义静态变量

拷贝构造函数

类中默认的函数

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

python中星号(*)和双星号(**)的用法