文章目录
- 一、传递实参
-
- 1.位置实参
- 2.关键字实参
- 3.默认值
- 4.等效的函数调用
- 5.避免实参错误
一、传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。
1.位置实参
调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参。最简单的关联方式是基于实参的顺序。这种关联方式称为位置实参。
为了弄明白工作原理,我们来看一个例子
例:定义一个显示宠物信息的函数,这个函数指出一个宠物属于哪种动物以及它叫什么名字。
def describe_pet(animal_type,pet_name):
"""显示宠物的信息"""
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name}")
describe_pet('hamster','harry')
- 1
- 2
- 3
- 4
- 5
- 6
输出结果:
当我们使用位置实参的时候,需要注意两点:
1.我们可以根据需要多次调用函数
2.位置实参的顺序很重要
2.关键字实参
关键字实参是传递给函数的名称值对。因为直接在实参中将名称和值关联起来,所以向函数传递实参时不会混淆。关键字实参让我们无须考虑函数调用中的实参顺序,还清楚的指出了函数调用各个值的用途。
例:重新编写上例
def describe_pet(animal_type,pet_name):
"""显示宠物的信息"""
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name}")
describe_pet(animal_type='hamster',pet_name='harry')
describe_pet(pet_name='harry',animal_type='hamster')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
输出结果:
关键字实参的顺序无关紧要,我们可以看到例中两种调用传参是等效的。
使用关键字实参时,务必准确指定函数定义中的形参名。
3.默认值
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。
给形参指定的默认值后,可在函数调用中省略相应的实参。
使用默认值可简化函数调用,还可以清楚的指出函数的典型用法。
例:当我们发现animal_type大多是小狗时,我们可以给形参animal_type的默认值设为dog
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}")
describe_pet(pet_name='harry')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
输出结果:
**特别需要注意的是!!!**可以看到我的代码里面修改了形参animal_type和pet_name的位置,这是是因为牵扯到了位置实参的问题。
使用默认值时,必须先在形参列表中列出没有默认值的形参,在列出有默认值的实参。这让python依然能够正确地解读位置实参。
4.等效的函数调用
鉴于可混合使用位置实参、关键字实参、和默认值,通常有多种等效的函数调用方式。
例:
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}")
#调用函数
#一条名为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')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
输出结果:
其实我们使用哪种调用方式都无关紧要,只要函数调用能生成我们期望的输出就可。
5.避免实参错误
一般我们看到报错信息里面出现traceback,就是因为出现实参不匹配的错误。