如何通过默认& python中的变长参数一起?

时间:2016-01-20 16:02:16

标签: python function python-2.7 arguments

我发现了许多关于python函数参数的查询,但仍然感到困惑。假设我想在某个函数中传递几个参数。

def anyFunc(name, age, sex = 'M', *cap_letters ):
    print "name ", name
    print "age ", age
    print "sex ", sex
    for s in cap_letters:
        print "capital letter: ", s

名称&年龄参数是位置参数。 sex是默认参数,后跟非关键字参数的可变长度,这些参数很少是随机大写字母。所以现在如果我跑

anyFunc("Mona", 45, 'F', *('H', 'K', 'L'))

它给了我完美的输出..

name  Mona
age  45
sex  F
capital letter:  H
capital letter:  K
capital letter:  L

但是,如果我通过下面的参数,我想使用默认的性别值而不是传递它。输出并不像预期的那样。

anyFunc("John", 45, *('H', 'K', 'L'))

name  John
age  45
sex  H
capital letter:  K
capital letter:  L

它应该采取性别的默认值,即' M'。我也试图在最后通过性别论证,但它给了我语法错误。有没有办法达到我想要的目的?

2 个答案:

答案 0 :(得分:2)

如果您还在主叫方使用/需要,请不要在函数签名中使用* magic。然后简单地将它放在两边,不要让它变得更复杂,因为它必须是:

def any_func(name, age, sex='M', capital_letters=()):
    print 'name ', name
    print 'age ', age
    print 'sex ', sex
    for capital_letter in capital_letters:
        print 'capital letter: ', capital_letter

被称为:

any_func('Mona', 45, 'F', ('H', 'K', 'L'))

默认为sex

any_func('John', 45, capital_letters=('H', 'K', 'L'))

如果您不想在多次调用时拼出capital_letters参数名称,可以重新排序参数,然后交换最后两个参数:

def any_func(name, age, capital_letters=(), sex='M'):
    print 'name ', name
    print 'age ', age
    print 'sex ', sex
    for capital_letter in capital_letters:
        print 'capital letter: ', capital_letter

呼叫:

any_func('Mona', 45, ('H', 'K', 'L'), 'F')
any_func('John', 45, ('H', 'K', 'L'))

答案 1 :(得分:1)

在你的功能中使性爱成为一个** kwargs。在你的功能中,检查用户是否已将性别作为关键参数。如果用户没有通过任何事情而不是继续使用性别的默认值。

你的功能将如下所示:

def anyFunc(name, age, *cap_letters,**sexKwarg): print "name ", name print "age ", age sex = sexKwarg.get('sex', 'M') print "sex ", sex for s in cap_letters: print "capital letter: ", s 用法: anyFunc("Mona", 45, *('H', 'K', 'L'), sex = 'F') anyFunc("Mona", 45, *('H', 'K', 'L')) ##use default sex