6.4.3 关键字参数和默认值
前面使用的参数都是位置参数,因为它们的位置至关重要——事实上比名称还重要。本节介绍的技巧让你能够完全忽略位置。要熟悉这种技巧需要一段时间,但随着程序规模的增大,你很快就会发现它很有用。
请看下面两个函数:
def hello_1(greeting, name):
print('{}, {}!'.format(greeting, name))
def hello_2(name, greeting):
print('{}, {}!'.format(name, greeting))
这两个函数的功能完全相同,只是参数的排列顺序相反。
>>> hello_1('Hello', 'world')
Hello, world!
>>> hello_2('Hello', 'world')
Hello, world!
有时候,参数的排列顺序可能难以记住,尤其是参数很多时。为了简化调用工作,可指定参数的名称。
>>> hello_1(greeting='Hello', name='world')
Hello, world!
在这里,参数的顺序无关紧要。
>>> hello_1(name='world', greeting='Hello')
Hello, world!
不过名称很重要(你可能猜到了)。
>>> hello_2(greeting='Hello', name='world')
world, Hello!
像这样使用名称指定的参数称为关键字参数,主要优点是有助于澄清各个参数的作用。这样,函数调用不再像下面这样怪异而神秘:
>>> store('Mr. Brainsample', 10, 20, 13, 5)
可以像下面这样做:
>>> store(patient='Mr. Brainsample', hour=10, minute=20, day=13, month=5)
虽然这样做的输入量多些,但每个参数的作用清晰明了。另外,参数的顺序错了也没关系。然而,关键字参数最大的优点在于,可以指定默认值。
def hello_3(greeting='Hello', name='world'):
print('{}, {}!'.format(greeting, name))
像这样给参数指定默认值后,调用函数时可不提供它!可以根据需要,一个参数值也不提供、提供部分参数值或提供全部参数值。
>>> hello_3()
Hello, world!
>>> hello_3('Greetings')
Greetings, world!
>>> hello_3('Greetings', 'universe')
Greetings, universe!
如你所见,仅使用位置参数就很好,只不过如果要提供参数name,必须同时提供参数greeting。如果只想提供参数name,并让参数greeting使用默认值呢?相信你已猜到该怎么做了。
>>> hello_3(name='Gumby')
Hello, Gumby!
很巧妙吧?还不止这些。你可结合使用位置参数和关键字参数,但必须先指定所有的位置参数,否则解释器将不知道它们是哪个参数(即不知道参数对应的位置)。
注意 通常不应结合使用位置参数和关键字参数,除非你知道这样做的后果。一般而言,除非必不可少的参数很少,而带默认值的可选参数很多,否则不应结合使用关键字参数和位置参数。
例如,函数hello可能要求必须指定姓名,而问候语和标点是可选的。
def hello_4(name, greeting='Hello', punctuation='!'):
print('{}, {}{}'.format(greeting, name, punctuation))
调用这个函数的方式很多,下面是其中的一些:
>>> hello_4('Mars')
Hello, Mars!
>>> hello_4('Mars', 'Howdy')
Howdy, Mars!
>>> hello_4('Mars', 'Howdy', '...')
Howdy, Mars...
>>> hello_4('Mars', punctuation='.')
Hello, Mars.
>>> hello_4('Mars', greeting='Top of the morning to ya')
Top of the morning to ya, Mars!
>>> hello_4()
Traceback (most recent call last):
File "", line 1, in
TypeError: hello_4() missing 1 required positional argument: 'name'
注意 如果给参数name也指定了默认值,最后一个调用就不会引发异常。
非常灵活,不是吗?而且无需做太多的工作就能获得这样的灵活性。在下一节中,我们将提供更大的灵活性。
领取专属 10元无门槛券
私享最新 技术干货