函数是带名字的代码块,用于完成具体的工作。 要执行函数定义的特定任务,可调用该函数。需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,而只需调用执行该任务的函数,让Python运行其中的代码。通过使用函数,程序的编写、阅读、测试和修复都将更容易。
目录
一、定义函数
下面先展示一个简单的函数结构:
def greet_user():
"""显示简单的问候语"""
print("hi")
greet_user()
- 第一行的代码使用关键字def表示定义的是一个函数,greet_user()是函数名(函数名可能在括号内指出函数为了完成任务需要什么样的信息),该函数不需要任何的额外信息就可以完成它的任务,因此括号内是空的。另外,定义函数需要以冒号结尾。
- 第二行的注释,使用三引号括起来,用来描述函数做了什么。
- 代码行print("hi")是函数体内的唯一一行代码,greet_user()只做一项工作: 打印hi。
- 要调用函数,可依次指定函数名以及用括号括起的必要信息,如最后一行代码所示,由于这个函数不需要任何信息,因此调用它时只需输入greet_user()即可。
二、传递实参
函数定义种可能包含多个实参,因此函数调用中也有可能有多个形参。向函数传递实参的方式很多,可以使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成;还可使用列表和字典。下面来依次介绍这些方式。
1、位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此, 最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。如下面的例子所示:
def introduce_myself(name,age):
""""打印自己的姓名和年龄"""
print("\n My name is "+ name +".")
print("I am "+ age + " years old.")
introduce_myself('wt',"20")
得到的结果为:
My name is wt.
I am 20 years old.
调用introduce_myself()时,需要按顺序提供名字和年龄,位置反了就不对了。此外,可以根据需要调用多次。
2、关键字实参
关键字实参是传递给函数的名称-值对,如下所示:
def describe_myself(name,age):
""""打印自己的姓名和年龄"""
print("\nMy name is "+ name +".")
print("I am "+ age + " years old.")
describe_myself(name='wt',age="20")
describe_myself(age="18",name="wj")
得到的结果如下所示:
My name is wt.
I am 20 years old.
My name is wj.
I am 18 years old.
由上面的例子可以看出在关键字实参中,只要关键字正确,实参的顺序无关紧要。
3、默认值
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用 指定的实参值;否则,将使用形参的默认值。如下:
def describe_myself(name,age="20"):
""""打印自己的姓名和年龄"""
print("\nMy name is "+ name +".")
print("I am "+ age + " years old.")
describe_myself(name='wt')
describe_myself(age="18",name="wj")
得到的结果为:
My name is wt.
I am 20 years old.
My name is wj.
I am 18 years old.
正如上面的例子所示,如果没有提供age实参,将返回默认值,如果重新设置了age的参数,则返回设定的值。
三、返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回 的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。
1、返回简单值
下面先来看一个简单的例子:
def get_formatted_name(first_name,last_name):
"""返回整洁的姓名"""
full_name = first_name +' ' + last_name
return full_name.title()
user = get_formatted_name("xiao","ming")
print(user)
输出的结果为:
Xiao Ming
2、让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数就只需要在必要时提供额外的信息。可以使用默认值让实参变成可选的。下面将函数get_formatted_name()进行扩展,使得该函数可以处理中间名,如下:
def get_formatted_name(first_name,last_name,middle_name = ""):
"""返回整洁的姓名"""
if middle_name:
full_name = first_name + " " + middle_name+ ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name.title()
user1 = get_formatted_name("xiao","ming")
user2 = get_formatted_name("wang","xiao","hua")
输出的结果为:
user1:Xiao Ming
user2:Wang Hua Xiao
为了让实参变成可选的,可以将该实参设置为空字符串,并将其放在最后。
3、返回字典
函数可以返回任意类型的值,包括列表和字典等比较复杂的数据结构。如下:
def get_formatted_name(first_name,last_name,middle_name = ""):
"""返回一个字典,其中包含一个人的信息"""
person = {"first":first_name,'last':last_name}
return person
user1 = get_formatted_name("xiao","ming")
print(f"user1:{user1}")
输出的结果为:
user1:{'first': 'xiao', 'last': 'ming'}
四、传递列表
通常情况下,还可以给函数传递列表,列表中可以包含名字、数字或者更复杂的对象(如字典)。将列表传递给数字后,函数就能直接访问其内容。下面列举一个简单的例子:
def greet_users(names):
"""向列表中的每位用户都发出简单的问候"""
for name in names:
msg = "Hello," + name.title() + "!"
print(msg)
usernames = ['mvkf','jvuhv','jush']
greet_users(usernames)
输出后的结果为:
Hello,Mvkf!
Hello,Jvuhv!
Hello,Jush!