函数 (function)是带名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用(call)该函数。当需要在程序中多次执行同一项任务时,无须反复编写完成该任务的代码,只需要调用执行该任务的函数,让Python运行其中的代码即可。
一、定义函数
下面是一个打印问候语的简单函数,名为hello():
python
def hello():
print("Hello World")
hello()
这个示例演示了最简单的函数结构。第一行代码使用关键字def来告诉Python,你要定义一个函数。这是函数定义,向Python指出了函数名,还可以在括号内指出函数为完成任务需要什么样的信息。最后,定义以冒号结尾。
紧跟在def hello():后面的所有缩进行构成了函数体。第二行的文本是称为文档字符串(docstring)的注释,描述了函数是做什么的。Python在为程序中的函数生成文档时,会查找紧跟在函数定义后的字符串。这些字符串通常前后分别用三个双引号引起,能够包含多行。
要使用这个函数,必须调用它。函数调用让Python执行函数中的代码。要调用函数,可依次指定函数名以及用括号括起的必要信息。
1、向函数传递信息
python
def hello(username):
print("Hello,", username.title())
hello('zhang')
在调用hello()时,可将一个名字传递给它。
output
Hello, Zhang
2、实参和形参
在hello()函数的定义中,变量username是一个形参 (parameter),即函数完成工作所需的信息。在代码hello('zhang')中,值'zhang'是一个实参(argument),即在调用函数时传递给函数的信息。在调用函数时,我们将要让函数使用的信息放在括号内。在hello('zhang')这个示例中,我们将实参'zhang'传递给函数hello(),这个值被赋给了形参username。
二、传递实参
函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多:既可以使用位置实参 ,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可以使用列表和字典。下面依次介绍这些方式。
1、位置实参
在调用函数时,Python必须将函数调用中的每个实参关联到函数定义中的一个形参。最简单的方式是基于实参的顺序进行关联。以这种方式关联的实参称为位置实参。
python
def pet(pet_type,pet_name):
print("I have a ",pet_type," ",pet_name)
pet('dog','lizi')
output
I have a dog lizi
可根据需要调用函数任意多次。
python
def pet(pet_type,pet_name):
print("I have a ",pet_type," ",pet_name)
pet('dog','lizi')
pet('cat','mimi')
output
I have a dog lizi
I have a cat mimi
2、关键字实参
关键字实参是传递给函数的名值对(name-value pair)。这样会直接在实参中将名称和值关联起来,因此向函数传递实参时就不会混淆了。关键字实参不仅让你无须考虑函数调用中的实参顺序,而且清楚地指出了函数调用中各个值的用途。
python
def pet(pet_type,pet_name):
print("I have a ",pet_type," ",pet_name)
pet(pet_type='dog',pet_name='lizi')
函数还和之前一样,但这次调用函数时,向Python明确地指出了各个实参对应的形参。
3、默认值
在编写函数时,可以给每个形参指定默认值。如果在调用函数中给形参提供了实参,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。
python
def pet(pet_name,pet_type='dog'):
print("I have a ",pet_type," ",pet_name)
pet(pet_name='lizi')
三、返回值
函数并非总是直接显示输出,它还可以处理一些数据,并返回一个或一组值。函数返回的值称为返回值。在函数中,可以使用return语句将值返回到调用函数的那行代码。返回值让你能够将程序的大部分繁重工作移到函数中完成,从而简化主程序。
python
def getName(first_name,last_name):
full_name=first_name+" "+last_name
return full_name.title()
name=getName("jack","michael")
print(name)
output
Jack Michael
函数可返回任何类型的值,包括列表和字典等较为复杂的数据结构。
python
def person(first_name,last_name):
person_info={'first_name':first_name,'last_name':last_name}
return person_info
name=person('zhang','liang')
print(name)
output
{'first_name': 'zhang', 'last_name': 'liang'}
四、传递列表
将列表传递给函数后,函数就能直接访问其内容。假设有一个用户列表,而我们要向其中的每个用户发出问候。
python
def greet_users(names):
for name in names:
msg="hello,"+name
print(msg)
usernames=['Lucy','Bob','Cindy']
greet_users(usernames)
我们将greet_users()定义成接受一个名字列表, 并将其赋给形参names。这个函数遍历收到的列表,并对其中的每个用户打印一条问候语。
output
hello,Lucy
hello,Bob
hello,Cindy
五、传递任意数量的实参
Python允许函数从调用语句中收集任意数量的实参。下面的函数只有一个形参*toppings,不管调用语句提供了多少实参,这个形参都会将其收入囊中:
python
def make_pizza(*toppings):
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'milk','peppers')
output
('pepperoni',)
('mushrooms', 'milk', 'peppers')
六、将函数存储在模块中
使用函数的优点之一是可将代码块与主程序分离。还可以将函数存储在称为模块的独立文件中,再将模块导入(import)主程序。import语句可让你在当前运行的程序文件中使用模块中的代码。
要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入程序的代码。下面来创建一个包含make_pizza()函数的模块。接下来,在目录中创建一个名为making_pizzas.py的文件。这个文件先导入刚创建的模块,再调用make_pizza()两次:
python
# function.py
def make_pizza(*toppings):
print(toppings)
python
# making_pizzas.py
import function
function.make_pizza('pepperoni')
function.make_pizza('mushrooms','milk','peppers')
编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。还可以只导入模块中的特定函数:
python
from module_name import function_name
如果要导入的函数的名称太长或者可能与程序中既有的名称冲突,可指定简短而独一无二的别名(alias):函数的另一个名称,类似于外号。例如:
python
from function import make_pizza as mp
mp('pepperoni')
mp('mushrooms','milk','peppers')
使用星号(*)运算符可让Python导入模块中的所有函数
python
from pizza import *