Python基础教程 关键字参数和默认值

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也指定了默认值,最后一个调用就不会引发异常。

非常灵活,不是吗?而且无需做太多的工作就能获得这样的灵活性。在下一节中,我们将提供更大的灵活性。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181003G0CFFY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券