3. 函数
函数是带名字的代码块,用于完成具体的工作。需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用执行该任务的函数,让Python运行其中的代码。通过使用函数,程序的编写、阅读、测试和修复都将更容易。
3.1 定义函数
定义一个打印问候语的简单函数,名为greet_user() 。
def greet_user():
"""显示简单的问候语"""
print("Hello!")
greet_user()
详解:
这个示例演示了最简单的函数结构
关键字def 来告诉Python你要定义一个函数,指出函数名,还可能在括号内指出函数为完成其任务需要什么样的信息,即参数。在这里,函数名为greet_user() ,它不需要任何信息就能完成其工作,因此括号是空的(即便如此,括号也必不可少)。最后,定义以冒号结尾。
紧跟在def greet_user(): 后面的所有缩进行构成了函数体。
文档字符串用三引号内是文档字符串 (docstring)的注释,描述了函数是做什么的。Python使用它们来生成有关程序中函数的文档。
代码行print("Hello!") 是函数体,greet_user() 只做一项工作:打印Hello!
指定函数名以及用括号括起的必要信息调用此函数,由于这个函数不需要任何信息,因此调用它时只需输入greet_user() 即可。
3.1.1 向函数传递信息
实例说明:传入被问候人名字,打印问候语。
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('jesse')
3.1.2 实参和形参
在上例函数greet_user() 的定义中的变量username 是一个形参。在调用函数greet_user('jesse') 时传递的值'jesse' 是一个实参 。实参是调用函数时实际传递给函数的信息。
3.2 传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。
向函数传递实参的方式很多,包括:
可使用位置实参:要求实参的顺序与形参的顺序相同;
关键字实参:其中每个实参都由变量名和值组成;
还可使用列表和字典。
3.2.1 位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。严格基于实参的顺序的参数关联方式被称为位置实参 。示例:一个显示宠物信息的函数。
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
示例说明:
函数的定义需要二个参数(形参):动物类型和一个名字;
调用该函数时,按顺序提供一种动物类型和一个名字(实参)。
3.2.2 关键字实参
关键字实参是传递给函数的名称---值对。直接在实参中将参数名称和传递的值关联起来了,关键字实参让
开发人员无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。示例:
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster') #等效上面一句
注意:关键字参数不区分顺序,但区分大小写。
3.2.3 默认值
编写函数时,可给每个形参指定默认值 。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。
示例:如果你发现调用describe_pet() 时,描述的多的是小狗,就可将形参animal_type 的默认值设置为'dog' 。这样,调用describe_pet() 来描述小狗时,就可不提供这种信息。
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie') #省略了对animal_type参数传递实参,默认使用dog
describe_pet('willie') #输出结果和上面一句相同
注意:使用参数默认值时,参数按照位置参数来解析。即上例中若函数定义为
def describe_pet(animal_type='dog',pet_name),
则describe_pet(pet_name='willie')或describe_pet('willie')调用都会报错,位置参数第二个参数未给定。
3.2.4 等效的函数调用
实例:若函数定义为def describe_pet(pet_name, animal_type='dog'): 则以下调用都是有效的
# 一条名为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')