我发现了许多关于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'。我也试图在最后通过性别论证,但它给了我语法错误。有没有办法达到我想要的目的?
答案 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