鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都是由变量名和值组成;还可以使用列表和字典。
位置实参
你调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。
来看一个显示宠物信息的函数。
def describe_pet(animal_type,pet_name): """显示宠物信息""" print(" I have a " + animal_type + " . ") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet('hamster','harry')
这个函数的定义表明,它需要一种动物类型和一个名字。。调用describe_pet()时,需要按顺序提供一种动物类型和一个名字。例如,在前面的函数调用中,实参’hamster’存储在形参animal_type中,而实参’harry’存储在形参pet_name中。在函数体内,使用了这两个形参来显示宠物信息。
I have a hamster . My hamster's name is Harry.
调用函数多次
你可以根据需要调用函数任意次。要再描述一个宠物,只需要再次调用describe_pet():
def describe_pet(animal_type,pet_name): """显示宠物信息""" print(" I have a " + animal_type + " . ") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet('hamster','harry') describe_pet('dog','willie')
位置实参的顺序很重要
使用位置实参来调用函数时,如果实参的顺序不正确,结果可能出乎意料。
关键字实参
关键字实参时传递给函数的名称—值对。你直接再实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值地用途。
def describe_pet(animal_type,pet_name): """显示宠物信息""" print(" I have a " + animal_type + " . ") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(animal_type='hamster',pet_name='harry')
默认值
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时。python将使用指定地实参值。否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。
def describe_pet(pet_name,animal_type = 'dog'): """显示宠物信息""" print(" I have a " + animal_type + " . ") print("My " + animal_type + "'s name is " + pet_name.title() + ".") describe_pet(pet_name='willie')
这里修改了函数describe_pet()的定义,在其中给形参animal_type指定了默认值’dog’。这样,调用这个函数时,若没有给animal_type指定值,python将把这个形参设置成’dog’。
请注意,在这个函数的定义中,修改了形参的排列顺序。由于给animal_type指定了默认值,无需通过实参来指定动物类型,因此在函数调用中只包含一个实参——宠物的名字。。然而,python依然将这个实参视为位置实参,因此如果函数调用中只包含宠物的名字,这个实参将关联到函数定义中的第一个形参。
使用这个函数的最简单的方式是
describe_pet('willie')
这个实参将关联到函数定义中的第一个形参——pet_name。
等效的函数调用
鉴于可混合使用位置实参,关键字实参和默认值,通常有多种等效的函数调用方式。请看下面:
def describe_pet(pet_name,animal_type = 'dog'):
基于这种定义,在任何情况下都必须给pet_name提供实参;指定该实参时可以使用位置方式,也可以使用关键字方式。如果描述的动物不是小狗,还必须在函数调用中给animal_type提供实参。
下面对这个函数的所有调用都可行:
#一条名为Willie的小狗 describe_pet('Willie') describe_pet(pet_name='Willie') #一只名为Harry的仓鼠 describe_pet('harry','hamster') describe_pet(pet_name='harry',animal_type='hamster') describe_pet(animal_type='hamster',pet_name='harry')