2016-01-20 107 views
4

我发现了许多关于python函数参数的查询,但仍然感到困惑。假设我想在某些函数中传递几个参数。如何在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 

name &年龄参数是位置参数。性别是默认参数,其次是非关键字参数的可变长度,这是非常少的随机资本字母。所以,现在,如果我跑

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'。我也尝试在最后通过性别论证,但它给了我语法错误。有什么方法可以实现我想要的吗?

+0

我的Python 3.0≥,你可以做'sex'一个[关键词 - ** **仅参数(https://www.python.org/dev/ PEPS/PEP-3102 /)。但是,在Python 2.x中,您没有该选项。 –

回答

0

在你的功能中做一个** 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

+0

是的..我必须通过这种方式..谢谢你的回复.. – Ankur

+0

我已经更新了我的答案,并发布了一个完整的解决方案。接受我的答案,如果这有帮助 –

+2

'kwargs'是一个字典,所以迭代通过它来得到一个密钥的值是疯了。只要做'sex = kwargs.get('sex','M')'。 – BlackJack

1

不要使用*神奇的功能,签名,如果您还使用/需要它把呼叫一侧。然后,只需将其放在两侧,不要使问题更加复杂,因为它必须是:

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

如果您不喜欢在很多调用中拼写出参数名称,并且可以对参数重新排序,则交换最后两个参数:

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')) 
相关问题