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 *
相关推荐
love530love5 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達5 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
星辰徐哥5 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥5 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约5 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee5 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐5 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs5 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐5 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司5 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录