Python(七)函数

函数 (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 *
相关推荐
慕容静漪12 分钟前
如何本地安装Python Flask并结合内网穿透实现远程开发
开发语言·后端·golang
ErizJ14 分钟前
Golang|锁相关
开发语言·后端·golang
烛阴1 小时前
手把手教你搭建 Express 日志系统,告别线上事故!
javascript·后端·express
良许Linux1 小时前
请问做嵌入式开发C语言应该学到什么水平?
后端
小臭希1 小时前
python蓝桥杯备赛常用算法模板
开发语言·python·蓝桥杯
mosaicwang1 小时前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
Pitayafruit1 小时前
SpringBoot整合Flowable【08】- 前后端如何交互
spring boot·后端·workflow
蹦蹦跳跳真可爱5892 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法
Bruce_Liuxiaowei2 小时前
基于Flask的Windows事件ID查询系统开发实践
windows·python·flask
小丁爱养花2 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring