8.2.2 关键字实参
关键字实参 是传递给函数的名称值对。因为直接在实参中将名称和值关联起来,所
以向函数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果)。关键
字实参让你无须考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的
用途。
下面来重新编写pets.py,在其中使用关键字实参来调用describe_pet() :
def describe_pet(animal_type, pet_name):
"""显示宠物的信息。"""
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet(animal_type='hamster', pet_name='harry')
函数describe_pet() 还和之前一样,但调用这个函数时,向Python明确地指出
了各个实参对应的形参。看到这个函数调用时,Python知道应该将实参'hamster'
和'harry' 分别赋给形参animal_type 和pet_name 。输出正确无误,指出有
一只名为Harry的仓鼠。
关键字实参的顺序无关紧要,因为Python知道各个值该赋给哪个形参。下面两个函
数调用是等效的:
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
注意 使用关键字实参时,务必准确指定函数定义中的形参名。
8.2.3 默认值
编写函数时,可给每个形参指定默认值 。在调用函数中给形参提供了实参时,
Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认
值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地
指出函数的典型用法。
例如,如果你发现调用describe_pet() 时,描述的大多是小狗,就可将形参
animal_type 的默认值设置为'dog' 。这样,调用describe_pet() 来描述小
狗时,就可不提供这种信息:
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息。"""
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet(pet_name='willie')
这里修改了函数describe_pet() 的定义,在其中给形参animal_type 指定了
默认值'dog' 。这样,调用这个函数时,如果没有给animal_type 指定值,
Python就将把这个形参设置为'dog' :
I have a dog.
My dog's name is Willie.
请注意,在这个函数的定义中,修改了形参的排列顺序。因为给animal_type 指
定了默认值,无须通过实参来指定动物类型,所以在函数调用中只包含一个实参
——宠物的名字。然而,Python依然将这个实参视为位置实参,因此如果函数调用
中只包含宠物的名字,这个实参将关联到函数定义中的第一个形参。这就是需要将
pet_name 放在形参列表开头的原因。
现在,使用这个函数的最简单方式是在函数调用中只提供小狗的名字:
describe_pet('willie')
这个函数调用的输出与前一个示例相同。只提供了一个实参'willie' ,这个实参
将关联到函数定义中的第一个形参pet_name 。由于没有给animal_type 提供实
参,Python将使用默认值'dog' 。
如果要描述的动物不是小狗,可使用类似于下面的函数调用:
describe_pet(pet_name='harry', animal_type='hamste